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