Git submodule push - PullRequest
       5

Git submodule push

104 голосов
/ 28 апреля 2011

Если я изменю подмодуль, могу ли я вернуть коммит обратно к источнику подмодуля, или для этого потребуется клон?Если клон, могу ли я сохранить клон внутри другого хранилища?

Ответы [ 2 ]

112 голосов
/ 28 апреля 2011

Подмодуль - это не что иное, как клон git-репо внутри другого репо с некоторыми дополнительными метаданными (запись дерева ссылок, файл .gitmodules)

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"
95 голосов
/ 04 июня 2012

Обратите внимание, что поскольку git1.7.11 ( [ANNOUNCE] Git 1.7.11.rc1 и примечание к выпуску , июнь 2012) упоминает:

"git push --recurse-submodules "научился по выбору изучать истории подмодулей, связанных с суперпроектом, и выталкивать их.

Вероятно, сделано после этого патча и --on-demandПараметр :

recurse-submodules=<check|on-demand>::

Убедитесь, что все коммиты субмодулей, используемые ревизиями, которые должны быть переданы, доступны в удаленной ветви отслеживания.

  • Если используется check, будет проверено, что все коммита подмодуля, которые были изменены в ревизиях, которые должны быть переданы, доступны на пульте дистанционного управления.
    В противном случае пуш будет отменен и завершится сненулевой статус.
  • Если используется on-demand, все субмодули, которые были изменены в ревизиях, которые должны быть переданы, будут выдвинуты.
    Если по запросу не удалось выдвинуть все необходимые ревизии, он также будет прерван и завершится сненулевой статус.

Таким образом, вы можете сдвинуть все за один раз с (из родительского репо) a:

git push --recurse-submodules=on-demand

Эта опция работает только для одного уровнягнездования.Изменения в подмодуле внутри другого подмодуля не будут отправлены.


В git 2.7 (январь 2016 г.) простого push git будет достаточно для запуска родительского репо ... и всех его подмодулей.

См. commit d34141c , commit f5c7cd9 (03 декабря 2015 г.), commit f5c7cd9 (03 декабря 2015 г.) и commit b33a15b (17 ноября 2015 г.)) Майк Кроу (mikecrowe) .
(Объединено Junio ​​C Hamano - gitster - в коммит 5d35d72 , 21 декабря 2015 г.)

push: добавить recurseSubmodules опция конфигурации

Параметр командной строки --recurse-submodules существует в течение некоторого времени, но не имеет конфигурацииэквивалент файла.

Следуя стилю соответствующего параметра для git fetch, давайте изобретем push.recurseSubmodules, чтобы обеспечить значение по умолчанию для этого параметра.
Это также требует добавления --recurse-submodules=no, чтобы разрешить настройкубыть переопределенным в командной строке при необходимости.

Самый простой способ реализовать это, кажется, заставить push использовать код в submodule-configаналогично fetch.

Документ git config теперь включает :

push.recurseSubmodules:

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

  • Если значение равно 'check', то Git проверит, что все коммиты субмодуля, которые были изменены в ревизиях, которые должны быть переданы, доступны, по крайней мере, на одном пульте субмодуля.Если какие-либо коммиты отсутствуют, push будет прерван и завершится с ненулевым статусом.
  • Если значение равно 'on-demand', то все подмодули, которые были изменены в ревизиях, которые должны быть переданы, будут перенесены.Если по требованию не удалось выдвинуть все необходимые изменения, он также будет прерван и завершится с ненулевым статусом.-
  • Если значение равно 'no', то поведение по умолчанию игнорирования подмодулей при нажатии сохраняется.

Вы можете переопределить эту конфигурацию во время нажатия, указав '--recurse-submodules=check|on-demand|no'.

Итак:

git config push.recurseSubmodules on-demand
git push

Git2.12 (1 квартал 2017 года)

git push --dry-run --recurse-submodules=on-demand действительно будет работать.

См. коммит 0301c82 , коммит 1aa7365 (17 ноября 2016) Брэндон Уильямс (mbrandonw) .
(Объединено Junio ​​C Hamano - gitster - в коммит 12cf113 , 16 декабря 2016 г.)

push run with --dry-run на самом деле (Git 2.11 декабря 2016 и ниже / до) не выполняет пробный прогон, когда push настроен на подталкивание субмодулей по требованию.
Вместо этого все подмодули, которые необходимо передать, фактически передаются на их пульты, в то время как любые обновления для суперпроекта выполняются как пробный запуск.
Это ошибка, а не предполагаемое поведение пробного запуска.

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


И все же в Git 2.12 у вас теперь есть опция "--recurse-submodules=only" для выталкивания субмодулей без выталкивания суперпроекта верхнего уровня .

См. коммит 225e8bf , коммит 6c656c3 , коммит 14c01bd (19 декабря 2016) Брэндон Уильямс (mbrandonw)) .
(Объединено с Junio ​​C Hamano - gitster - in commit 792e22e , 31 Jan 2017)

...