我很感兴趣是否可以安全地并行运行(例如在 cron 作业、jenkins 作业等中)git push
。git commit
git 中是否内置了一些锁定机制,以便这些操作被序列化,或者这会破坏存储库?
2 回答
是的。Git 通过以允许这样做的方式编写引用来工作。如果您在推送的同时进行提交,则推送只会从引用向下传递到它们包含的对象。如果提交完成并按时更新分支引用,它将被推送。如果没有,旧的引用将被推送。你不会被推高“半个提交”。
所有文件都以隐式保留任何指针的引用完整性的方式编写。最后写入的文件将是已经包含所有依赖项的引用。
从理论上讲,可能存在文件不可用的git commit
零件竞争条件的罕见情况。
在 Git 2.15.x/2.16(2018 年第一季度)之前,这是沉默的。不会再沉默了。HEAD
请参阅Andrey Okoshkin (``)的提交 c26de08(2017 年 10 月 20 日) 。(由Junio C Hamano 合并——在提交 4a1638c中,2017 年 11 月 6 日)
gitster
commit
: resolve_ref_unsafe 的检查结果在打印提交摘要时添加对已解析的 HEAD 引用的检查。如果 . 的基础调用或失败,则
resolve_ref_unsafe()
可能返回NULL
指针。 这种情况可能是由种族引起的:文件此时变得无法访问。lstat()
open()
files_read_raw_ref()
消息变为:
if (!head)
die_errno(_("unable to resolve HEAD after creating commit"));
使用 Git 2.36(2022 年第二季度),消息内容发生了变化:
请参阅Ævar Arnfjörð Bjarmason ( ) 的提交 ce14de0和提交 09444e7(2022 年 1 月 26 日)。(由Junio C Hamano 合并 -- --在03bdcfc 提交中,2022 年 2 月 11 日)avar
gitster
sequencer
: 不要die_errno()
在refs_resolve_ref_unsafe()
失败时使用签字人:Ævar Arnfjörð Bjarmason
更改忠实迁移到ed90f04
"resolve_errno"
中的新API 的代码(“refs API: make not set errno”,2021-10-16,Git v2.35.0-rc0 --批次 #1中列出的合并)停止关心at全部。resolve_ref_unsafe()
errno
当我们在序列器运行后无法解析“ ”时,说明“ ”值是
HEAD
什么并没有真正的帮助,因为假后端可能反映也可能不反映有关“ ”状态的任何真实情况。 随着即将到来的 reftable 后端,这种伪造将变得更加明显。errno
errno
.git/HEAD
所以让我们
die()
不要在die_errno()
这里。
这也将有助于简化refs_resolve_ref_unsafe()
API。
这是唯一没有忽略“failure_errno
”输出参数的用户。