Git толчок подмодуля

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

Ответ 1

Подмодуль - это не что иное, как клон репо git в другом репо с некоторыми дополнительными метаданными (запись дерева gitlink, файл .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"

Ответ 2

Обратите внимание, что поскольку 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) простое нажатие Git будет достаточно, чтобы нажать родительское репо... и все его подмодули.

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

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

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

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

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

git config doc теперь включает:

push.recurseSubmodules:

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

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

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

Итак:

git config push.recurseSubmodules on-demand
git push

Git 2.12 (Q1 2017)

git push --dry-run --recurse-submodules=on-demand будет работать.

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

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

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


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

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