Мы используем подмодули git для управления парой крупных проектов, которые зависят от многих других библиотек, которые мы разработали. Каждая библиотека представляет собой отдельный репозиторий, внесенный в зависимый проект в виде подмодуля. Во время разработки мы часто хотим просто взять последнюю версию каждого зависимого подмодуля.
Есть ли в git встроенная команда для этого? Если нет, то как насчет пакетного файла Windows или аналогичного, который может это сделать?
git
git-submodules
Брэд Робинсон
источник
источник
Ответы:
Если вы впервые берете репо, вам нужно использовать его в
--init
первую очередь:Для git 1.8.2 или выше
--remote
была добавлена опция для поддержки обновления до последних подсказок удаленных веток:Это дает дополнительное преимущество, заключающееся в уважении к любым веткам «не по умолчанию», указанным в файлах «
.gitmodules
или».git/config
(если у вас есть такие ветки , по умолчанию это origin / master, и в этом случае некоторые другие ответы здесь также будут работать).Для git 1.7.3 или выше вы можете использовать (но ниже приведены некоторые вопросы о том, какое обновление все еще применяется):
или:
если вы хотите подтянуть свои подмодули к последним коммитам вместо текущего коммита, на который указывает репо.
Смотрите git-submodule (1) для подробностей
источник
git submodule update --recursive
настоящее время.git submodule foreach "(git checkout master; git pull)&"
origin master
конца этой команды может привести к неожиданным результатам, если некоторые из ваших подмодулей отслеживают другую ветвь или имя местоположения этого конкретного подмодуля. Очевидно для некоторых, но, вероятно, не для всех.git submodule update --recursive
проверяет, какая ревизия хранится в родительском репозитории для каждого подмодуля, а затем проверяет эту ревизию в каждом подмодуле. Он НЕ вытягивает последние коммиты для каждого подмодуля.git submodule foreach git pull origin master
илиgit pull origin master --recurse-submodules
это то, что вы хотите, если вы намереваетесь обновить каждый подмодуль до последнего из их исходных репозиториев. Только тогда вы получите ожидающие изменения в родительском репо с обновленными хэшами ревизий для подмодулей. Проверьте это, и все хорошо.Пока ошибка не будет устранена, в первый раз вам нужно запустить
источник
git pull --recurse-submodules
ниgit submodule update --recursive
не делает не инициализации вновь добавленного подмодулей. Для их инициализации вам нужно запуститьgit submodule update --recursive --init
. Цитата из руководства : Если субмодуль еще не инициализирован, и вы просто хотите использовать настройку, сохраненную в .gitmodules, вы можете автоматически инициализировать субмодуль с опцией --init.git submodule update --recursive --remote
которой также обновляются субмодули до удаленной последней версии вместо сохраненного SHA-1.На init запускается следующая команда:
из каталога git repo лучше всего работает для меня.
Это потянет все последние, включая подмодули.
Разъяснения
После этого вы можете просто запустить:
из каталога git repo лучше всего работает для меня.
Это потянет все последние, включая подмодули.
источник
Примечание: это с 2009 года и, возможно, тогда было хорошо, но сейчас есть лучшие варианты.
Мы используем это. Это называется
git-pup
:Просто поместите его в подходящий каталог bin (/ usr / local / bin). Если в Windows вам может понадобиться изменить синтаксис, чтобы заставить его работать :)
Обновить:
В ответ на комментарий оригинального автора о включении всех заголовков всех подмодулей - это хороший вопрос.
Я почти уверен, что
git
не имеет команды для этого внутри. Для этого вам нужно будет определить, что HEAD на самом деле для подмодуля. Это может быть так просто, как сказатьmaster
это самая современная ветка и т. Д ...После этого создайте простой скрипт, который выполняет следующие действия:
git submodule status
наличие «модифицированных» репозиториев. Первый символ выходных строк указывает на это. Если суб-репо изменен, вы НЕ МОЖЕТЕ продолжить.git checkout master && git pull
. Проверьте на ошибки.Я хотел бы отметить, что этот стиль не совсем то, для чего были созданы подмодули git. Как правило, вы хотите сказать, что «LibraryX» имеет версию «2.32» и будет оставаться такой, пока я не скажу «обновить».
Это в некотором смысле то, что вы делаете с описанным сценарием, но просто более автоматически. Требуется осторожность!
Обновление 2:
Если вы работаете на платформе Windows, вы можете захотеть использовать Python для реализации скрипта, так как он очень эффективен в этих областях. Если вы используете unix / linux, тогда я предлагаю просто скрипт bash.
Нужны какие-либо разъяснения? Просто оставьте комментарий.
источник
git config --global alias.pup '!git pull && git submodule init && git submodule update && git submodule status'
а затем использовать его какgit pup
без каких-либо сценариев.git submodule init
после первого извлечения с включенными подмодулями, чтобы все начало работать правильно.Хенрик на правильном пути. Команда 'foreach' может выполнить любой произвольный скрипт оболочки. Два варианта, чтобы вытащить самый последний может быть,
а также,
Это будет перебирать все инициализированные подмодули и запускать заданные команды.
источник
У меня на Windows работает следующее.
источник
редактировать :
В комментариях было указано (по словам philfreo ), что требуется последняя версия. Если есть вложенные подмодули, которые должны быть в их последней версии:
----- устаревший комментарий ниже -----
Разве это не официальный способ сделать это?
Я использую это каждый раз. Пока проблем нет.
Редактировать:
Я только что обнаружил, что вы можете использовать:
Который также будет рекурсивно тянуть все подмодули, то есть зависимости.
источник
git submodule update --init --recursive
git submodule foreach --recursive git pull
Так как может случиться так, что веткой по умолчанию ваших подмодулей не является
master
, вот как я автоматизирую полные обновления подмодулей Git:источник
Первый раз
Подмодуль Clone и Init
Остаток
Во время разработки просто потяните и обновите субмодуль
Обновите подмодуль Git до последней фиксации на источнике
Предпочтительный способ должен быть ниже
примечание: последние две команды имеют одинаковое поведение
источник
git submodule update
сделал свое дело. Теперь я загружаю данные субмодуля, отсутствующие в первом шаге клона. Спасибо. Я не очень хорош в Git: CЯ не знаю, с какой версии git это работает, но вот что вы ищете:
Я также использую его
git pull
для обновления корневого хранилища:источник
Приведенные выше ответы хороши, однако мы использовали git-hooks, чтобы сделать это проще, но получается, что в git 2.14 вы можете установить
git config submodule.recurse
значение true, чтобы подмодули обновлялись, когда вы загружаете свой git-репозиторий.Это будет иметь побочный эффект, когда вы будете подталкивать все подмодули, которые у вас есть, если они находятся на ветвях, но если вам уже нужно такое поведение, это может помочь.
Может быть сделано с помощью:
источник
git submodule init
заранее, хотя, если ваш подмодуль еще не инициализирован.Git для Windows 2.6.3 :
git submodule update --rebase --remote
источник
С верхнего уровня в репо:
Это переключит все ветки на разработку и загрузку последних
источник
git submodule foreach git pull origin master
Пришлось добавить ветку, которую я хотел получить. кроме этого, работал отлично.Я сделал это, адаптируя gahooa «сек ответ выше :
Интегрировать это с мерзавцем
[alias]
...Если ваш родительский проект имеет нечто подобное в
.gitmodules
:Добавьте что-то подобное в ваш .gitconfig
Затем, чтобы обновить ваши подмодули, запустите:
У меня есть пример этого в моем репозитории установки среды .
источник
Все, что вам нужно сделать сейчас, это просто
git checkout
Просто убедитесь, что он включен через этот глобальный конфиг:
git config --global submodule.recurse true
источник
Вот командная строка для извлечения из всех ваших репозиториев git, являются ли они подмодулями или нет:
Если вы запускаете его в своем верхнем git-репозитории, вы можете заменить
"$ROOT"
на.
.источник
Я думаю, вам придется написать сценарий для этого. Если честно, я мог бы установить python для этого, чтобы вы могли использовать
os.walk
tocd
для каждого каталога и выполнять соответствующие команды. Использование python или другого языка сценариев, отличного от пакетного, позволит вам легко добавлять / удалять подпроекты без необходимости изменять сценарий.источник
Замечание: не слишком легкий способ, но работоспособный и у него есть свои уникальные плюсы.
Если кто-то хочет клонировать только
HEAD
ревизию репозитория и толькоHEAD
s из всех его подмодулей (т.е. для извлечения «ствола»), тогда можно использовать следующий скрипт Lua . Иногда простая командаgit submodule update --init --recursive --remote --no-fetch --depth=1
может привести к неисправимойgit
ошибке. В этом случае необходимо очистить подкаталог.git/modules
каталога и клонировать подмодуль вручную, используяgit clone --separate-git-dir
команду. Единственная сложность состоит в том, чтобы узнать URL , путь.git
каталогу подмодуля и путь к подмодулю в дереве суперпроекта.Примечание: скрипт проверяется только на наличие
https://github.com/boostorg/boost.git
репозитория. Его особенности: все подмодули размещены на одном хосте и.gitmodules
содержат только относительные URL-адреса .источник