对所有Git子模块的递归Git拉取只需要

8ljdwjyq  于 2022-11-27  发布在  Git
关注(0)|答案(3)|浏览(194)

我的个人存储库有一些存储库作为子模块。

$ 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提供的一个命令行就能完成这个。

utugiqy6

utugiqy61#

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

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

guykilcj2#

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 addgit commit

wztqucjr

wztqucjr3#

Git 2.18(Q2 2018)可以通过改进git submodule update来避免这个错误,因为git submodule update会影响git submodule pull
git submodule update“尝试了两种不同的“git fetch“对上游仓库抓取一个绑定在子模块路径上的提交,但是如果第一种(即正常的获取)失败,它错误地放弃了,使得第二种“最后手段”(即通过对象名称获取一个准确的提交对象)无效。
这一问题已得到纠正。
2018年5月15日,发行第一张专辑《X1 E1 F1 X》。
(2018年5月30日,由Junio C Hamano -- gitster --commit a173ddd中合并)

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

这是fb43e31(子模块:尝试更努力地通过直接获取sha1来获取所需的sha1,2016-02-23,Git 2.8.0),并修复了一些假设不正确的问题。
提交声明:
如果$sha1不是默认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(Q2 2019)改进了子模块获取的错误消息
参见Jonathan Tan ( jhowtan )commit bd5e567(2019年3月13日)。
(由Junio C Hamano -- gitster --合并至commit 32414ce,2019年4月9日)

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

当使用--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“错误;然后,在给定散列的情况下进行获取,获取成功。
此提交改进了通知,使其更清楚地表明我们正在重试提取,并且前面的消息(特别是来自提取的致命错误)不一定指示整个命令失败。
请注意,在Git 2.34(Q4 2021)中,部分“git submodule“(man)在C中的重新实现仍在继续。
参见Atharva Raykar ( tfidfwastaken )commit c51f8f9(2021年8月24日)。
(2021年9月20日,由Junio C Hamano -- gitster --commit e78db9d中合并)
第1331章:从C运行更新过程
推荐人:克里斯蒂安·库德
推荐人:舒里亚·舒克拉
签署人:阿萨瓦·雷卡尔
添加一个新的子模块--helper子命令run-update-procedure,如果子模块的SHA1与超级项目所期望的不匹配,该子命令将运行更新过程。
这意味着上面提到的is_tip_reachable shell方法不再存在。
Git 2.36(2022年第二季度)和“git submodule update”(man)也在C语言中进行了同样的重写。
请参阅第一版第十六页、第一版第十七页、第一版第十八页、第一版第十九页、第一版第二十页、第一版第二十一页、第一版第二十二页、第一版第二十三页(2022年3月4日),作者:第一版第二十四页。
请参见Atharva Raykar ( tfidfwastaken )commit 3ce52cbcommit 5312a85commit a77c3fc(2022年3月4日)。
参见Ævar Arnfjörð Bjarmason ( avar )commit ed9c848commit aca8568(2022年3月4日)。
(2022年3月23日由Junio C Hamano -- gitster --合并于commit 7649bfb
Git 2.39(2022年第四季度)的重写对手,其中包括准备删除git-submodule.sh,并用一个内置的替代它。
请参见第一次电子邮件发送的第34页、第35页、第36页、第37页、第38页、第39页、第40页、第41页、第42页(2022年11月8日)。
(2022年11月23日,由Junio C Hamano -- gitster --commit 1107a39中合并)

相关问题