将子模块更新为最新的提交
Posted
技术标签:
【中文标题】将子模块更新为最新的提交【英文标题】:Update a submodule to the latest commit 【发布时间】:2012-01-01 17:47:13 【问题描述】:我有一个项目 A,它是一个库,它在项目 B 中使用。
项目 A 和 B 在 github 上都有一个单独的存储库,但在 B 内部我们有一个 A 的子模块。
我在库上编辑了一些类,在repo A中,我推送了远程repo,所以库(repo A)被更新了。
这些更新不反映子模块引用先前提交的“参考”(子模块)......我应该怎么做才能更新 git 上的子模块?
【问题讨论】:
首先:git submodule update --remote --merge
确保子模块指向最新的哈希(在 git 1.8 之后有效)。然后通过提交子模块提交指向子模块新哈希的指针:git add proj/submodule
然后git commit -m 'adding new submodule'
我最喜欢的答案是这个:***.com/a/42175412/1601580
【参考方案1】:
进入子模块目录:
cd projB/projA
从你的项目 A 中提取 repo(不会更新你的父项目 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
将子模块更新为最新的远程提交。在大多数情况下会很方便。
【讨论】:
顺便说一句,如果您不是子模块的所有者,您可以在其他人更新 projA 时执行git submodule update
(您将获得一个新的提交 ID)。
我拥有子模块 main repo(proj A),但我是 proj B 的提交者。
@Kjuly 提交后,如何将其推送到远程?只是git push
吗?
@KR29 对,完整的 cmd 是 git push <remote> <branch>
,例如git push origin dev
.
git submodule update
仅在已拉取提交(在项目 B 中)更新对相关子模块(项目 A)的引用时才有效。要更新项目 B 以引用项目 A 的远程跟踪分支的 HEAD
,您需要执行 git submodule update --remote --merge
,如下面的 Paul Hatcher 回答所示。【参考方案2】:
从 git 1.8 开始就可以了
git submodule update --remote --merge
这会将子模块更新为最新的远程提交。然后,您需要添加并提交更改,以便更新父存储库中的 gitlink:
首先,git添加它
git add project/submodule_proj_name
然后 git 提交它
git commit -m 'gitlink to submodule_proj_name was updated'
git 推送吧
git push
然后推送更改,因为没有这个,指向子模块的 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)
你在提交后做了“git push”吗,记住提交只是改变你的本地存储库,你必须把它推送到远程让其他人看到它
此答案中缺少(但在下面的其他答案中注明):更新的子模块需要在提交之前使用git add
暂存。
@joshng 我觉得每个正在处理子模块的人都会理解这一点。这是唯一帮助我的帖子,非常感谢。【参考方案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"
当您推送更改时,请确保先推送子模块中的更改,然后推送外部 repo 中的参考更改。这样更新的人总是能够成功运行
git submodule update
关于子模块的更多信息可以在这里找到http://progit.org/book/ch6-6.html。
【讨论】:
如果您在运行git submodule
时没有看到 +
,请确保您已经初始化并导入了子模块。对应的命令分别是 git submodule init
和 git submodule update
。【参考方案4】:
单行版本
git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"
【讨论】:
【参考方案5】:以上答案都不适合我。
这是解决方案,从 父 目录运行:
git submodule update --init;
cd submodule-directory;
git pull;
cd ..;
git add submodule-directory;
现在你可以git commit
和git push
【讨论】:
【参考方案6】:其他一些答案建议在子模块的目录中合并/提交,IMO 可能会变得有点混乱。
假设远程服务器名为origin
,我们想要子模块的master
分支,我倾向于使用:
git submodule foreach "git fetch && git reset --hard origin/master"
注意:这将对每个子模块执行硬重置 -- 如果您不希望这样做,可以将 --hard
更改为 --soft
。
【讨论】:
【参考方案7】:我的项目应该为子模块使用“最新”。在 Mac OSX 10.11,git 版本 2.7.1 上,我不需要“进入”我的子模块文件夹来收集它的提交。我只是做了一个常规的
git pull --rebase
在顶层,它正确地更新了我的子模块。
【讨论】:
【参考方案8】:Andy 的回应通过转义 $path 对我有用:
git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"
【讨论】:
@Andy Webov's 答案不需要转义的原因可能是因为他们在路径周围使用了单引号,例如。'$path'
以上是关于将子模块更新为最新的提交的主要内容,如果未能解决你的问题,请参考以下文章