将子模块更新为最新的提交

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 masterYour 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 initgit 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 commitgit 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'

以上是关于将子模块更新为最新的提交的主要内容,如果未能解决你的问题,请参考以下文章

如何将子模块添加到 github 存储库

如何将子模块添加到子目录?

Git:将子模块文件检出到单个目录中

sh 将子模块添加到git项目

Git - 子模块脏 - Visual Studio项目文件

反应路线将子路线移动到单独的模块?