Обновите подмодуль до последнего коммита - PullRequest
222 голосов
/ 19 ноября 2011

У меня есть проект A, который является библиотекой и он используется в проекте B.

Оба проекта A и B имеют отдельный репозиторий на github, НО внутри B у нас есть подмодуль A.

Я отредактировал некоторые классы в библиотеке, которая находится в хранилище A, я нажал на удаленное хранилище, поэтому библиотека (хранилище A) обновлена.

Эти обновления не отражают "ссылка "(подмодуль) подмодуль ссылается на предыдущий коммит .... что я должен сделать, чтобы обновить подмодуль в git?

Ответы [ 7 ]

297 голосов
/ 19 ноября 2011

Введите каталог подмодуля:

cd projB/projA

Извлеките репозиторий из вашего проекта A ( не обновит статус git вашего родителя, проект B):

git pull origin master

Вернитесь в корневую директорию и проверьте обновление:

cd ..
git status

Если субмодуль обновлялся раньше, он будет отображать что-то вроде ниже:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

Затем подтвердите обновление:

git add projB/projA
git commit -m "projA submodule updated"
80 голосов
/ 11 февраля 2017

Начиная с git 1.8 вы можете сделать

git submodule update --remote --merge

Это обновит субмодуль до последней удаленной фиксации.Затем вам нужно будет зафиксировать изменение, чтобы обновить gitlink в родительском репозитории

git commit

, а затем отправить изменения, так как без этого идентификатор SHA-1, указывающий на подмодуль, не будет обновлени поэтому изменение не будет видно никому другому.

35 голосов
/ 19 ноября 2011

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

git status

покажет что-то вроде:

modified:
   some/path/to/your/submodule

Тот факт, что субмодуль не синхронизирован, также можно увидеть с помощью

git submodule

вывод покажет:

+afafaffa232452362634243523 some/path/to/your/submodule

Знак плюса указывает, что ваш подмодуль указывает впереди того места, куда, как ожидает верхний репо, указывает.

просто добавьте это изменение:

git add some/path/to/your/submodule

и передайте это:

git commit -m "referenced newer version of my submodule"

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

git submodule update

Более подробную информацию о подмодулях можно найти здесь http://progit.org/book/ch6-6.html.

18 голосов
/ 20 октября 2014

Однострочная версия

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
1 голос
/ 26 апреля 2019

Несколько других ответов рекомендуют объединять / фиксировать в каталоге подмодуля, что в IMO может стать немного беспорядочным.

Предполагая, что удаленный сервер имеет имя origin, и мы хотим получить ветку master подмодуля (ов), я склонен использовать:

git submodule foreach "git fetch && git reset --hard origin/master"

Примечание: Это выполнит полный сброс для каждого подмодуля - если вы не хотите этого, вы можете изменить --hard на --soft.

0 голосов
/ 04 июля 2018

Ответ Энди работал для меня, избегая $ path:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"
0 голосов
/ 19 июня 2016

Мой проект должен использовать «последний» для подмодуля. На Mac OSX 10.11, git версии 2.7.1, мне не нужно было заходить в мою папку субмодуля, чтобы собрать его коммиты. Я просто сделал обычный

git pull --rebase 

на верхнем уровне, и он правильно обновил мой подмодуль.

...