Подмодуль git застрял при неправильной фиксации («обновление подмодуля» не работает) - PullRequest
1 голос
/ 30 мая 2019

У меня есть родительский проект с подмодулем (без вложенных подмодулей). Подмодуль имеет новый коммит (назовем его new-sha), и родитель ссылается на этот коммит в удаленном репо (я вижу submodule @ new-sha при просмотре репо в веб-браузере). Я вытащил родительский проект, и он также ссылается на правильный коммит в рабочем каталоге, как показано в git show output:

--- a/submodule
--- b/submodule
@@ -1 +1 @@
-Subproject commit old-sha
+Subproject commit new-sha

т.е. последний коммит в родительском проекте изменил подмодуль на new-sha. Однако, ни git submodule update, ни git pull --recurse-submodules не обновляются до new-sha в подмодуле, они всегда проверяют old-sha.

Почему и как это исправить?

git version 2.21.0.windows.1

Некоторая дополнительная информация: подмодуль имеет sha-new локально, но его заголовок застрял на sha-old.

sha-new немедленно получен из sha-old, и вот последние 3 коммита, возможно это может дать подсказку:

sha-new  == the top of submodule's branch used by parent project
sha-old  == HEAD
sha-xyz  == origin/HEAD

Строка origin/HEAD беспокоит меня. Даже после ручного извлечения субмодуля (cd submodule; git pull origin branch-name:branch-name) origin/HEAD остался на третьем коммите сверху.

1 Ответ

0 голосов
/ 30 мая 2019

Необходимо убедиться, что новый коммит был помещен в удаленный репозиторий субмодуля. (тот, который указан в строке URL .gitmodules )

Затем вам нужно сделать git-статус в вашем локальном клоне основного родительского репо, чтобы проверить, что он не позднее ветви master и что git ls-tree показывает правильную фиксацию корневого дерева подмодуля .


OP me76 добавляет в комментарии :

Я «решил» это по-другому.
Мне пришлось внести некоторые изменения в субмодуль, поэтому я вручную переключился на правильный коммит, сделал и зафиксировал изменения в субмодуле и зафиксировал субмодуль в родительском проекте.
Это, наконец, обновило ссылку на подмодуль.

Это потому, что это заставляет главный репозиторий обновлять gitlink (специальная запись в индексе) для ссылки на новый коммит дерева главной папки подмодуля.
Нажав, что опубликует этот новый коммит gitlink.


ОП также относится к этой теме :

У человека была (явно противоречивая) версия подмодуля в индексе (git ls-files --stage | grep 160000).

После удаления его из индекса (git rm --cached) и повторного добавления его с помощью git submodule add я наконец смог обновить подмодуль из родительского проекта.

Примечание: git rm --cached asubmoduleFolder не должно заканчиваться на «/»: вы удаляете gitlink (специальная запись «160000» в индексе). Не папка.

...