Подмодуль - это нормальный репозиторий, , за исключением ...
- , которым управляет какой-то другой Git репозиторий, и
- файлы репозитория (которые обычно находятся в каталоге
.git
на верхнем уровне рабочего дерева подмодуля) могли быть перемещены в этот другой репозиторий Git.
Это перемещение -of-repository-files называется поглощение , и если каталог Git был поглощен, ваш cp -a
не скопировал их. (Если подмодуль не был поглощен, ваш cp -a
, вероятно, работал, и вы не задавали вопрос о StackOverflow.) Вместо этого, на верхнем уровне рабочего дерева подмодуля есть файл с именем .git
, который содержит одну строку, относящуюся к поглощенному местоположению. В этой строке часто используется относительный путь:
$ cat submodule/.git
gitdir: ../.git/modules/submodule
Относительный путь все еще может быть действительным, в скопированном рабочем дереве, или нет.
Если вы wi sh, чтобы скопировать сам репозиторий подмодуля, вам нужно будет сделать это отдельно. В противном случае вы можете позволить копии рабочего дерева напрямую ссылаться на исходный репозиторий, но если вы сделаете это, вы попадете на несколько опасную территорию. То, что сейчас git worktree add
раньше было сценарием, который делал то же самое, и в нем много подводных камней. Поэтому вам, вероятно, следует просто скопировать хранилище субмодулей в новый нормальный клон, а не клон, который был поглощен.
Чтобы сделать , что , обычно проще всего просто повторно клонировать субмодуль, используя git clone
. Обычно проще всего выполнить повторное клонирование из того места, откуда был клонирован исходный подмодуль. Например, если существует submodule/.git
, потому что .gitmodules
говорит:
[submodule "submodule"]
path = submodule
url = https://github.com/someorg/submodule
, вам, вероятно, нужно просто git clone https://github.com/someorg/submodule
снова.
Однако вы можете клонировать из клона, который сделал ваш суперпроект. , который теперь находится в .git/modules/submodule
как пустой клон:
git clone /path/to/superproject/.git/modules/submodule
В любом случае, теперь у вас есть новый клон - независимый репозиторий с индексом (где вы можете собрать предложенный новый коммит) и рабочее дерево (где вы можете просматривать и проверять файлы для сборки предложенного нового коммита), которое не используется совместно с хранилищем, индексом и рабочим деревом, управляемым суперпроектом, так что суперпроект не может разрушить любой из них.