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 $sha1
was 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 submodule
” (man)的部分内容。
请参阅Atharva Raykar ( ) 的提交 c51f8f9(2021 年 8 月 24 日)。(由Junio C Hamano 合并 -- --在提交 e78db9d中,2021 年 9 月 20 日)tfidfwastaken
gitster
指导者:Christian Couder
指导者:Shourya Shukla
签署者:Atharva Raykar
run-update-procedure
如果子模块的 SHA1 与超级项目的预期不匹配,则添加一个新的子模块 --helper 子命令,该命令将运行更新过程。
这意味着is_tip_reachable
上面提到的shell方法不再存在。