我的个人存储库有一些存储库作为子模块。以及以下命令
$ 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提供的一个命令行可以实现这一点。
答案 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 add
和git commit
。
答案 2 :(得分:0)
Git 2.18(2018年第二季度)可能会通过改善影响git submodule update
的{{1}}来避免此错误。
“git submodule pull
”会尝试两种不同的“git submodule update
”
反对上游存储库以获取子模块路径上的提交绑定,但是如果第一种类型(即正常提取)失败则错误地放弃,使第二种“最后手段”成为一种(即按对象名称获取精确提交对象)无效的。
这已经得到纠正。
commit e30d833见Stefan 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 bd5e567见Jonathan 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)并不一定表示整个命令失败。