2012-04-16 3 views
171

Мой проект StrutureGit подмодуль обновление рекурсивный

ProjectA 
-FrameworkA (submodule) 
--Twig (submodule of FrameworkA) 

Как я могу обновить подмодуль рекурсивными? Я уже пробовал несколько команд Git (на корне Projecta)

git submodule foreach git pull origin master 
or 
git submodule foreach --recursive git pull origin master 

но не могу тянуть файлы из Twig

+0

Как насчет [ГИТ-глубоко] (https://github.com/bluejamesbond/git-deep)? – bluejamesbond

ответ

374
git submodule update --recursive 

Вы также, вероятно, хотите использовать --init вариант, который сделает его инициализировать любой неинициализированные подмодули:

git submodule update --init --recursive 

Примечание: в некоторых старых версиях Git, если вы используетеОпция, уже инициализированные подмодули могут не обновляться. В этом случае вы также должны запустить команду без опции --init.

+0

Как насчет рекурсивного добавления подмодуля? «git submodule add FrameworkA.git» просто извлекает файлы FrameworkA. – complez

+1

Вы можете просто сделать «git subodule add blah», а затем «git subodule update --init --recursive». – drewag

+0

Разве это отличается от моего пути ниже? –

18

Как я использую:

git submodule update --init --recursive 
git submodule foreach --recursive git fetch 
git submodule foreach git merge origin master 
+2

Я работал с изменением последней строки на: 'git subodule foreach git pull -ff-only origin master' –

+1

Я также добавил бы --recursive к последней строке:« git subodule foreach --ресурсный git merge origin master »иначе вы можете получить грязный подмодуль, когда он сам обновил подмодуль. –

+0

Он искал это в течение последних трех часов. Спасибо, сэр. Чтобы добавить к этому, вы также можете использовать эти команды для совершения таких операций, как: 'git submodule foreach --recursive 'git commit -a | : ''. ':' Делает его циклом независимо от результата. См. [Link] (https://stackoverflow.com/questions/19728933/continue-looping-over-submodules-with-the-git-submodule-foreach-command-after) https://stackoverflow.com/questions/19728933/продолжающие-зацикливания-над-подмодулями-с-ГИТ-подмодуль-Еогеасп-командный после. –

12

Как может случается, что ветвь по умолчанию ваших подмодулей неmaster (что случается много в моем случае), это то, как я автоматизировать полный Git подмодулей обновления:

git submodule init 
git submodule update 
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx' 
+0

Я попытался добавить эту команду в свой [общий файл Makefile] (https://github.com/Falkor/Makefiles/blob/devel/repo/Makefile), но я все еще придерживаюсь того, чтобы сделать GNU Make * ignore * интерпретацией последовательность $ (...), несмотря на присутствие в простых котировках. У кого-нибудь есть идея? –

+0

Ваша команда - это то, что мне нужно, спасибо! Но я получаю: 'Entering 'Core' fatal: неоднозначный аргумент 'origin/HEAD': неизвестная версия или путь не в рабочем дереве.' Где 'Core' является подмодулем – Sanandrea

+0

Полезная информация, спасибо за обмен! –

0

В последнее время Git (я использую v2.15.1), следующие будут сливаться вверх по течению изменения подмодуль в подмодулями рекурсивно:

git submodule update --recursive --remote --merge 

Вы можете добавить --init для инициализации неинициализированным подмодулей и использовать --rebase, если вы хотите, чтобы перебазировать вместо слияния.

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

git add . && git commit -m 'Update submodules to latest revisions' 
Смежные вопросы