Как сделать так, чтобы подмодуль с отдельной ГОЛОВКОЙ прикреплялся к актуальной ГОЛОВЕ?

Когда я добавляю подмодуль Git в репозиторий Git, как этот,

git submodule add ssh://server/proj1/ proj1
git submodule init
git submodule update

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

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

cd proj1
git checkout master

Это переключит текущую главную ветку HEAD, но это не обновит связь. Поэтому, если вы снова клонируете весь репозиторий, он все равно будет связан со старой версией.

Если я хочу, чтобы он всегда был связан с самой последней версией (HEAD), что мне делать?


person eonil    schedule 27.12.2011    source источник
comment
Обратите внимание, что подмодуль теперь может отслеживать ветку. см. мой отредактированный ответ.   -  person VonC    schedule 03.04.2013
comment
Я нашел этот stackoverflow.com/a/20797186/1808261 информативным после того, как попал в этот пост.   -  person dtmland    schedule 24.03.2015
comment
Возможный дубликат Как я могу согласовать отключенный HEAD с главным / источником?   -  person Julio Marins    schedule 23.05.2016


Ответы (1)


Обновление март 2013 г.

Git 1.8.2 добавил возможность отслеживать ветки.

«git submodule» начал изучать новый режим для интеграции с концом удаленной ветви (в отличие от интеграции с фиксацией, записанной в gitlink суперпроекта).

# add submodule to track master branch
git submodule add -b master [URL to Git repo];

# update your submodule
git submodule update --remote 

См. Также руководство Vogella по подмодулям.


Оригинальный ответ (декабрь 2011 г.)

добавленный подмодуль будет в отдельном режиме HEAD

Да, подмодуль предназначен для ссылки на конкретный коммит, а не на ветку.
Итак:

  • Если вы проверяете фиксацию SHA1 (или тега), вы находитесь в автономном режиме HEAD.
  • Если вы проверяете ветку (как вы это делали с ветвью master подмодуля), вы можете создавать другие коммиты поверх этой ветки (но вам нужно будет вернуться к родительскому репо, чтобы также зафиксировать указанного родителя, для вас необходимо записать новый коммит подмодуля, который вы создали)

Подробнее см. Истинный характер подмодулей.

Если вам всегда нужна последняя фиксация другого репо, самым простым способом было бы объединить их вместе (например, с помощью слияния поддеревьев).
См. "Объединить 2 одинаковых репозитория GIT" для получения подробной информации и ссылок.

person VonC    schedule 27.12.2011
comment
Обратите внимание, что подмодули git сильно отличаются, например, от внешних модулей svn. См. stackoverflow.com/questions/3131912/ - person VonC; 27.12.2011
comment
Примечание на потом. subtree merge не для меня, и я думаю, что submodule будет ответом, если он хорошо поддерживает отслеживание. - person eonil; 05.12.2013
comment
@Eonil, но он очень хорошо поддерживает отслеживание, если вы тоже этого хотите. просто его основная функция - записывать фиксированную версию. - person VonC; 05.12.2013
comment
Кто-нибудь сможет помочь? Я следую этим двум командам Git 1.8.2, и каждый раз, когда я делаю новый клон репозитория, подмодули по-прежнему отсоединяются, а не указывают на нашу ветку разработки. Любые идеи? - person FateNuller; 09.08.2016
comment
@FateNuller Да, в этом суть подмодуля: он всегда отсоединен. Вы можете добавить директиву в файл .gitmodules, чтобы указать ему на обновление, но это не меняет того факта, что родительское репо записывает SHA1 для этого подмодуля, и любой последующий клон будет проверять подмодуль на этом SHA1, отсоединенный. - person VonC; 09.08.2016
comment
@VonC Да, я просто хотел бы, чтобы у git была возможность автоматически проверять конкретную ветку для каждого подмодуля. - person electronix384128; 02.05.2017
comment
Да, использовать фиксацию вместо ветки - облом. Это заставило меня переключиться с подмодулей на vcstool (github.com/dirk-thomas/vcstool) - person mc.dev; 28.11.2018