Обновление подмодуля до последней фиксации
У меня есть проект 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')"