Подмодуль git проверяет тот же коммит

После того, как я git submodule update, он всегда проверяет один и тот же коммит. например 34561.

Я делаю git checkout master для подмодуля, а затем git submodule sync. Затем он указывает на последнюю фиксацию a2344.

Но после update снова указывает на коммит 34561.

Как это изменить? Я имею в виду, почему он решил указать на этот коммит, а не на другой?


person lapots    schedule 20.05.2015    source источник


Ответы (4)


Я имею в виду, почему он решил указать на этот коммит, а не на другой?

Поскольку подмодуль всегда записывает фиксированную фиксацию SHA1 в родительском репозитории как gitlink (a < strong>специальная запись в указателе).
Вот почему подмодуль всегда восстанавливается как отдельная ветка HEAD

Вы можете настроить подмодуль для следования ветке

cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>

Подмодуль по-прежнему будет восстановлен до фиксированной фиксации, но затем его можно будет обновить с помощью:

git submodule update --remote

Обязательно добавьте и зафиксируйте новый gitlink в родительском репозитории (поскольку обновление подмодуля до последней версии ветки изменит его SHA1, записанный в родительском репозитории как gitlink).
Если вы этого не сделаете, вы вернете свой подмодуль в его предыдущее состояние в следующем git submodule update --init.

Подробнее см. в разделе «Подмодули Git: укажите ветку/тег".

person VonC    schedule 20.05.2015

«Основной» проект содержит ссылку на SHA-1 извлеченной версии каждого подмодуля. Это часть коммита в основном проекте.

Если вы меняете голову подмодуля вручную в подмодуле, вам нужно сообщить основному проекту, что отныне он должен использовать этот SHA-1 для подмодуля.

git commit -a

сделает это, так как основной проект увидит, что заголовок подмодулей был обновлен.

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

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

person Peter Tillemans    schedule 20.05.2015

Вам нужно зайти в папку подмодуля и выполнить:

git fetch --all --prune
git pull origin master

И теперь у вас будет последняя фиксация в подмодуле.
Как только вы запустите выборку, она обновит вашу папку .git в подмодуле с последними фиксациями. Это позволит убедиться, что у вас есть последние изменения.

person CodeWizard    schedule 20.05.2015
comment
вопрос не в том, как получить последнюю версию, а в том, почему она проверяет именно этот 34561 commiy - person lapots; 20.05.2015
comment
Мне нужно увидеть репозиторий, чтобы убедиться, но похоже, что ваш подмодуль не обновляется, поэтому вы продолжаете получать один и тот же репозиторий. Можете ли вы опубликовать последний идентификатор фиксации вашего подмодуля до и после git submodule update - person CodeWizard; 20.05.2015

Вы можете выполнить:

git submodule foreach git pull origin master

Это обновит все ваши подмодули.

person Yordan Ivanov    schedule 20.05.2015
comment
Я делаю точно так же (но только git submodule foreach git pull). Дело в том, что он всегда обновляется до одного и того же коммита 34561 - person lapots; 20.05.2015
comment
Git сохраняет идентификатор фиксации SHA1 в базе данных репозитория. Блокировка подмодуля с помощью определенного идентификатора фиксации гарантирует, что ваш код будет работать, и никакие критические изменения не будут применены ни к одному обновлению. Однако, если вы вытащите мастер, ваш репозиторий заблокируется с последней фиксацией. - person Yordan Ivanov; 20.05.2015