Обновление подмодуля до последней фиксации

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

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

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

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

6 ответов


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

cd projB/projA

вытяните РЕПО из проекта A (will не обновите Статус 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"

Так как git 1.8 вы можете сделать

git submodule update --remote --merge

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

git commit

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


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

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.


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

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"

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

git pull --rebase 

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


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

git submodule foreach "(git checkout master; git pull; cd ..; git add $path; git commit -m 'Submodule Sync')"