5

我的个人存储库有一些存储库作为子模块。以及以下命令

$ git submodule foreach git pull origin master

进入 ruby​​ 存储库后立即面临以下结果,因为 ruby​​ 存储库似乎没有 master 分支并且“git pull”停止了。

Entering 'rails'
From git://github.com/rails/rails
 * branch            master     -> FETCH_HEAD
Already up-to-date.
Entering 'roo'
From git://github.com/hmcgowan/roo
 * branch            master     -> FETCH_HEAD
Already up-to-date.
Entering 'ruby'
fatal: Couldn't find remote ref master
Stopping at 'ruby'; script returned non-zero status.

所以我的问题是what should I do to git pull for all of submodules only by git command?我应该为此编写脚本吗?我希望 git 提供的一个命令行就能做到这一点。

4

3 回答 3

5

只需添加|| true到您的子模块命令:

git submodule foreach 'git commit -m "my commit message" || true'
于 2014-07-19T16:32:51.243 回答
4

git子模块通常处于 detached-HEAD 状态,因此git pull在它们上无法弄清楚您在合并阶段的意思。如果您要做的只是将最新的更改放入存储库,请尝试git submodule foreach git fetch。如果你想让每个子模块master更新到各自的origin/master,那么你可以跟进git submodule foreach git checkout master; git submodule foreach git merge origin/master.

然后,当然,您需要决定您希望主存储库使用的每个子模块的版本(我不建议origin/master一直盲目使用 - 它可能不稳定 - 最好选择已知良好的标签或其他东西),在子模块中检查这些版本,并在您的主存储库中跟进适当git add的 s 。git commit

于 2013-02-19T16:40:26.843 回答
0

Git 2.18(2018 年第二季度)可能会通过改进git submodule update影响git submodule pull.

" git submodule update" 尝试两种不同类型的 " git fetch" 针对上游存储库来获取子模块路径上的提交绑定,但如果第一种(即正常获取)失败,它会错误地放弃,使第二种“最后手段”成为一种(即通过对象名称获取确切的提交对象)无效。
这已得到纠正。

请参阅Stefan Beller ( ) 的提交 e30d833(2018 年 5 月 15 日(由Junio C Hamano 合并 -- --提交 a173ddd中,2018 年 5 月 30 日)stefanbeller
gitster

git-submodule.sh: 努力获取子模块

这是fb43e31的逻辑连续体(子模块:通过直接获取 sha1,2016-02-23,Git 2.8.0 更加努力地获取所需的 sha1)并修复它,因为某些假设不正确。

提交状态:

If $sha1was not part of the default fetch ... fail 我们这里假设fetch_in_submodule只有当服务器端不支持 sha1 获取时才会失败。

还有其他的失败,为什么这样的fetch可能会失败,比如

fatal: Couldn't find remote ref HEAD

如果远程端没有发布 HEAD 并且我们没有本地 fetch refspec,则可能会发生这种情况。

协议规范允许不发布 HEAD 并且会发生,例如,如果 HEAD 指向未出生的分支。

当子模块被浅层提取时,可能会发生没有本地提取参考规范,因为 git-clone 不会设置提取参考规范。

因此,通过忽略第一次提取的退出代码,更努力地尝试子模块,而不是依靠以下内容is_tip_reachable来查看我们是否再次尝试提取


注意:子模块获取的错误消息已在 Git 2.22(2019 年第二季度)中得到改进

请参阅Jonathan Tan ( ) 的提交 bd5e567(2019 年 3 月 13 日(由Junio C Hamano 合并 -- --提交 32414ce中,2019 年 4 月 9 日)jhowtan
gitster

子模块:清楚地解释第一次尝试失败

当使用--recurse-submodules具有至少一个子模块且 HEAD 指向未生成分支的超级项目进行克隆时,克隆过程如下所示:

Cloning into 'test'...
<messages about cloning of superproject>
Submodule '<name>' (<uri>) registered for path '<submodule path>'
Cloning into '<submodule path>'...
fatal: Couldn't find remote ref HEAD
Unable to fetch in submodule path '<submodule path>'
<messages about fetching with SHA-1>
From <uri>
    * branch            <hash> -> FETCH_HEAD
Submodule path '<submodule path>': checked out '<hash>'

换句话说,首先,在没有散列参数的情况下进行提取(即 HEAD 的提取),从而导致“ Couldn't find remote ref HEAD”错误;然后,在给定哈希的情况下完成提取,该哈希成功。

此提交改进了我们正在重试 fetch 的通知,并且之前的消息(特别是 fetch 的致命错误)并不一定表明整个命令失败。


请注意,在 Git 2.34(2021 年第四季度)中,继续用 C重新实现“ git submoduleman)的部分内容。

请参阅Atharva Raykar ( ) 的提交 c51f8f9(2021 年 8 月 24 日(由Junio C Hamano 合并 -- --提交 e78db9d中,2021 年 9 月 20 日)tfidfwastaken
gitster

submodule--helper: 从 C 运行更新程序

指导者:Christian Couder
指导者:Shourya Shukla
签署者:Atharva Raykar

run-update-procedure如果子模块的 SHA1 与超级项目的预期不匹配,则添加一个新的子模块 --helper 子命令,该命令将运行更新过程。

这意味着is_tip_reachable上面提到的shell方法不再存在。

于 2018-06-03T22:57:02.940 回答