将子模块更新为最新提交


269

我有一个项目A,它是一个库,在项目B中使用。

项目A和B在B中的github BUT上都有一个单独的存储库,我们有A的子模块。

我在库中(位于仓库A中)编辑了一些类,然后按了远程仓库,因此库(仓库A)已更新。

这些更新不会反映子模块引用先前提交的“引用”(子模块)....我应该怎么做才能在git上更新子模块?

Answers:


358

输入子模块目录:

cd projB/projA

从项目A中提取仓库(不会更新项目B的父项的git状态):

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"

更新

正如@paul指出的那样,从git 1.8开始,我们可以使用

git submodule update --remote --merge

将子模块更新为最新的远程提交。在大多数情况下会很方便。


35
顺便说一句,如果您不是子模块的所有者,则可以git submodule update在其他人更新projA时进行操作(您将获得一个新的提交ID)。
2011年

我自己的子模块主要回购(PROJ A),但我在该凸出B.一名提交
脂肪

@Kjuly提交后,如何将其推送到远程?就是git push
KR29

1
@ KR29对,完整的cmd是git push <remote> <branch>,例如git push origin dev
2016年

2
git submodule update仅在提交(在项目B中)将提交更新为相关子模块(项目A)的引用的提交时,才没有标志。要更新项目B以引用项目HEADA的远程跟踪分支,您将需要执行git submodule update --remote --merge以下Paul Hatcher的回答所示的操作。
Ben Burns

109

从git 1.8开始

git submodule update --remote --merge

这会将子模块更新为最新的远程提交。然后,您需要提交更改,以便更新父存储库中的gitlink

git commit

然后推送更改,因为没有此更改,指向子模块的SHA-1标识将不会更新,因此其他任何人都看不到更改。


即使我这样做,git commit其他所有人仍然看不到它。On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Max N

1
提交后是否进行了“ git push”操作,请记住,提交只是更改了本地存储库,您必须将其推送到远程,其他人才能看到它
Paul Hatcher

缺少此答案(但在下面的其他答案中指出):git add在提交之前,必须暂存已更新的子模块。
joshng

1
@joshng我觉得每个在子模块上工作的人都会明白这一点。这是唯一帮助过我的帖子,非常感谢。
Husk Rekoms,

38

如果更新子模块并提交给它,则需要转到包含的或更高级别的存储库,然后在其中添加更改。

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,请确保已初始化并导入了子模块。用于的命令分别是git submodule initgit submodule update
Fureigh


2

其他一些答案建议在子模块的目录中合并/提交,这可能会使IMO变得有些混乱。

假设远程服务器已命名,origin并且我们想要master子模块的分支,则我倾向于使用:

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

注意:这将在每个子模块上执行硬重置-如果您不希望这样做,则可以更改--hard--soft


1

我的项目应使用“最新”作为子模块。在Mac OSX 10.11(git版本2.7.1)上,我不需要“进入”我的子模块文件夹来收集其提交。我只是定期做

git pull --rebase 

在顶层,它正确地更新了我的子模块。


0

安迪的回应通过转义$ path为我工作:

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

@Andy Webov的答案不需要转义的原因可能是因为,例如,他们在路径周围使用了单引号。'$path'
S0AndS0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.