Как изменить копию подмодуля Git в обычное дерево Git - PullRequest
0 голосов
/ 02 апреля 2020

Я только начал работать над подмодулем моего основного проекта. Этот подмодуль хорошо поддерживается системой сборки, которую можно использовать самостоятельно, и тестовыми программами, которые соответствуют требованиям модуля.

Поэтому я взял существующую копию подмодуля из дерева супер репо и скопировал это в новом месте:

cd ~/wip/superrepo
cp -a submodule ../submodule_edit
cd ../submodule_edit
# Do work
git status
fatal: Not a git repository: ../.git/modules/submodule
# Aha, it needs its super repo

SO побуждает меня рассмотреть такие вопросы, как «Как отменить подмодуль» и так далее. Я не хочу превращать этот модуль в подкаталог супер репо. Супер репо - это набор модулей, которые являются аналогами в иерархии подмодулей, и это нормально. Я просто хочу сделать эту изолированную разработку, и мне не пришло в голову клонировать из собственного репозитория модуля при запуске.

git субмодуль deinit для отмены регистрации субмодуля из его родительского супер репо. Мне это не нужно, и я сомневаюсь, что это будет работать, поскольку. git в submodule_edit - это висячий указатель на метаданные супер-репо.

Я чувствую, что есть некоторый тривиальный шаг, который превратит мое дерево submodule_edit в нормально работающую git песочницу вместо сироты.

1 Ответ

1 голос
/ 02 апреля 2020

Подмодуль - это нормальный репозиторий, , за исключением ...

  • , которым управляет какой-то другой 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

В любом случае, теперь у вас есть новый клон - независимый репозиторий с индексом (где вы можете собрать предложенный новый коммит) и рабочее дерево (где вы можете просматривать и проверять файлы для сборки предложенного нового коммита), которое не используется совместно с хранилищем, индексом и рабочим деревом, управляемым суперпроектом, так что суперпроект не может разрушить любой из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...