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

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

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

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

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

Ответ 1

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

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"

Ответ 2

С git 1.8 можно делать

git submodule update --remote --merge

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

git commit

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

Ответ 3

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

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.

Ответ 4

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

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

Ответ 5

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

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

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

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

Ответ 6

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

git pull --rebase 

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

Ответ 7

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

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

Ответ 8

git submodule update --init помог мне.