Вопрос: Легкий способ вытащить последние из всех подмодулей git


Мы используем подмодули git для управления несколькими крупными проектами, которые имеют зависимости от многих других библиотек, которые мы разработали. Каждая библиотека представляет собой отдельное репо, введенное в зависимый проект как подмодуль. Во время разработки мы часто хотим просто взять последнюю версию каждого зависимого подмодуля.

У git есть встроенная команда для этого? Если нет, как насчет пакетного файла Windows или аналогичного, который может это сделать?


1343


источник


Ответы:


Для git 1.8.2 или выше опции --remoteбыл добавлен для поддержки обновления последних советов удаленных филиалов:

git submodule update --recursive --remote

Это имеет дополнительное преимущество в отношении любых ветвей «не по умолчанию», указанных в .gitmodulesили .git/configфайлы (если у вас есть какие-либо, по умолчанию - источник / хозяин, в этом случае некоторые из других ответов здесь также будут работать).

Для git 1.7.3 или выше, вы можете использовать (но нижеследующий вопрос о том, какое обновление все еще применяется):

git submodule update --recursive

или:

git pull --recurse-submodules

если вы хотите вытащить подмодули в последнюю фиксацию вместо того, на что указывает репо.

Примечание. Если это первый раз вы проверяете репо, которое вам нужно использовать --initпервый:

git submodule update --init --recursive

Для старше, git 1.6.1 или выше вы можете использовать что-то похожее (модифицированное для соответствия):

git submodule foreach git pull origin master

Видеть ГИТ-подмодуль (1) для подробностей


1691



Если вам нужно вытащить материал для подмодулей в свои хранилища подмодулей, используйте

git pull --recurse-submodules

функция git впервые была изучена в 1.7.3.

Но это не будет проверять правильные коммиты (те, на которые указывает ваш главный репозиторий) в подмодулях

Чтобы проверить правильность коммитов в ваших подмодулях, вы должны обновить их после

git submodule update --recursive --remote

564



Примечание: Это с 2009 года, и, возможно, это было хорошо, но теперь есть лучшие варианты.

Мы используем это. Это называется git-pup:

#!/bin/bash
# Exists to fully update the git repo that you are sitting in...

git pull && git submodule init && git submodule update && git submodule status

Просто поместите его в соответствующий каталог bin (/ usr / local / bin). Если в Windows вам может понадобиться изменить синтаксис, чтобы заставить его работать :)

Обновить:

В ответ на комментарий оригинального автора о том, чтобы вытащить все главы всех подмодулей - это хороший вопрос.

Я уверен, что gitне имеет для этого команды. Для этого вам нужно будет определить, что такое HEAD для субмодуля. Это может быть так просто, как сказать masterявляется самой современной ветвью и т. д.

После этого создайте простой скрипт, который выполняет следующие действия:

  1. проверить git submodule statusдля «модифицированных» репозиториев. Это указывает первый символ выходных строк. Если подрепо будет изменено, вы НЕ захотите его продолжить.
  2. для каждого зарегистрированного репо, cd в его каталог и запустить git checkout master && git pull, Проверьте наличие ошибок.
  3. В конце я предлагаю вам распечатать дисплей пользователю, чтобы указать текущее состояние подмодулей - возможно, предложите им добавить все и совершить?

Я хотел бы упомянуть, что этот стиль не совсем то, для чего были созданы подмодули git. Как правило, вы хотите сказать, что «LibraryX» находится в версии «2.32» и останется таким, пока я не скажу «обновить».

То есть, в некотором смысле, то, что вы делаете с описанным сценарием, но просто более автоматически. Требуется уход!

Обновление 2:

Если вы находитесь на платформе Windows, вам может понадобиться использовать Python для реализации сценария, поскольку он очень способен в этих областях. Если вы используете unix / linux, я предлагаю только сценарий bash.

Нужны какие-либо разъяснения? Просто отправьте комментарий.


294



В init запускается следующая команда:

git submodule update --init --recursive

изнутри каталога git repo, работает лучше всего для меня.

Это приведет к появлению всех последних, включая подмодули.

Разъяснения

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            --init without the explicit init step if you do not intend to customize
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

После этого вы можете просто запустить:

git submodule update --recursive

изнутри каталога git repo, работает лучше всего для меня.

Это приведет к появлению всех последних, включая подмодули.

Разъяснения

git - the base command to perform any git command
    submodule - Inspects, updates and manages submodules.
        update - Update the registered submodules to match what the superproject
        expects by cloning missing submodules and updating the working tree of the
        submodules. The "updating" can be done in several ways depending on command
        line options and the value of submodule.<name>.update configuration variable.
            any submodule locations.
            --recursive is specified, this command will recurse into the registered
            submodules, and update any nested submodules within.

283



Хенрик находится на правильном пути. Команда foreach может выполнять любой произвольный сценарий оболочки. Возможны два варианта:

git submodule foreach git pull origin master

а также,

git submodule foreach /path/to/some/cool/script.sh

Это будет проходить через все инициализируется подмодулей и запускать заданные команды.


150



Следующее работало для меня в Windows.

git submodule init
git submodule update

137



редактировать :

В комментариях было указано (по philfreo ), что требуется последняя версия. Если есть какие-либо вложенные подмодули, которые должны быть в их последней версии:

git submodule foreach --recursive git pull

----- Устаревший комментарий ниже -----

Разве это не официальный способ сделать это?

git submodule update --init

Я использую его каждый раз. На данный момент проблем нет.

Редактировать:

Я только что нашел, что вы можете использовать:

git submodule foreach --recursive git submodule update --init 

Который также рекурсивно вытягивает все подмодули, т. Е. Зависимости.


33



As it may happens that the default branch of your submodules is not master, this is how I automate the full Git submodules upgrades:

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'

29



First time

Clone and Init Submodule

git clone git@github.com:speedovation/kiwi-resources.git resources
git submodule init

Rest

During development just pull and update submodule

git pull --recurse-submodules  && git submodule update --recursive

Update Git submodule to latest commit on origin

git submodule foreach git pull origin master

Preferred way should be below

git submodule update --remote --merge

note: last two commands have same behaviour


24



I don't know since which version of git this is working, but that's what you're searching for:

git submodule update --recursive

I use it with git pull to update the root repository, too:

git pull && git submodule update --recursive

18



Look at http://lists.zerezo.com/git/msg674976.html which introduces a --track parameter


6