简单地递归git pull所有的git子模块

时间:2013-02-19 15:27:49

标签: git git-submodules

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

$ git submodule foreach git pull origin master

在进入ruby存储库后立即遇到以下结果,因为ruby存储库似乎没有主分支并且“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提供的一个命令行可以实现这一点。

3 个答案:

答案 0 :(得分:5)

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

git submodule foreach 'git commit -m "my commit message" || true'

答案 1 :(得分:2)

git子模块通常处于分离-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 addgit commit

答案 2 :(得分:0)

Git 2.18(2018年第二季度)可能会通过改善影响git submodule update的{​​{1}}来避免此错误。

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

commit e30d833Stefan Beller (stefanbeller)(2018年5月15日) (由Junio C Hamano -- gitster --合并于commit a173ddd,2018年5月30日)

  

git fetch:更加努力地获取子模块

     

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

     

提交声明:

     
    

如果git-submodule.sh不是默认提取的一部分...我们自己失败假设$sha1仅在服务器端不支持sha1提取时失败。

  
     

还有其他失败,为什么这样的提取可能会失败,例如

fetch_in_submodule
     

如果远程端不通告HEAD而我们不通知,则可能发生这种情况   有一个本地获取refspec。

     

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

     

获取子模块时,不会发生本地提取refspec   浅,因为git-clone没有设置fetch refspec。

     

所以通过忽略子代码的退出代码来更加努力地尝试子模块   首先获取,而不是依赖于以下fatal: Couldn't find remote ref HEAD 来   看看我们是否尝试重新获取

注意:使用Git 2.22(2019年第二季度)改进了子模块提取的错误消息

commit bd5e567Jonathan Tan (jhowtan)(2019年3月13日) Junio C Hamano -- gitster --合并于commit 32414ce,2019年4月9日)

  

子模块:明确说明第一次尝试失败

     

使用is_tip_reachable克隆至少一个超级项目时   一个副模块,HEAD指向一个未出生的分支,克隆人去了   像这样的东西:

--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>' ”错误;   然后,在给定哈希值的情况下完成提取,这将成功。

     

这个提交改进了我们正在重试的通知更清楚   获取,以及之前的消息(特别是致命错误   来自fetch)并不一定表示整个命令失败。