Подмодуль Git push

128

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

webjay
источник
4
В git 2.7 (январь 2016 г.) вам нужно будет установить только один раз git config push.recurseSubmodules on-demand. Тогда простого git pushбудет достаточно, чтобы все запихнуть (основное репо и подмодули). См. Мой отредактированный ответ ниже .
VonC
Предоставьте образец кода того, что вы пытаетесь сделать.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Ответы:

138

Подмодуль - это не что иное, как клон репозитория 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"
manojlds
источник
1
Да, и не забудьте получить изменения из вашей синхронизированной локальной ветки (если есть) перед отправкой. Бывает, например. при работе с gh-pagesветкой документации по
репозиторию
Я не понимаю, как можно записать cd your_submodule перед добавлением your_submodule? Я думаю, что лучший способ добавить подмодуль - использовать команду "добавить" git. Так есть ли другой способ добавить подмодуль?
MrSo 04
1
@MrSo Я думаю, что подмодуль уже есть, он пытается что-то изменить в подмодуле.
HattrickNZ
108

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

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

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

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

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

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

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

git push --recurse-submodules=on-demand

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


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

См. Коммит d34141c , фиксацию f5c7cd9 (3 декабря 2015 г.), фиксацию f5c7cd9 (3 декабря 2015 г.) и фиксацию 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

Git 2.12 (первый квартал 2017 г.)

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

См. Commit 0301c82 , commit 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" возможность выталкивать подмодули, не выталкивая суперпроект верхнего уровня .

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

VonC
источник
Это доступно сейчас, не так ли?
CMCDragonkai
@CMCDragonkai, да, вы можете увидеть это на git-scm.com/docs/git-push . Я отредактировал ответ.
VonC
Есть ли рекурсивная фиксация?
CMCDragonkai
1
вы всегда можете сделать 'git
submodule
Мне пришлось обновить мой файл .gitmodules с помощью URL-адресов bitbucket.
wclark