24

我很感兴趣是否可以安全地并行运行(例如在 cron 作业、jenkins 作业等中)git pushgit commitgit 中是否内置了一些锁定机制,以便这些操作被序列化,或者这会破坏存储库?

4

2 回答 2

19

是的。Git 通过以允​​许这样做的方式编写引用来工作。如果您在推送的同时进行提交,则推送只会从引用向下传递到它们包含的对象。如果提交完成并按时更新分支引用,它将被推送。如果没有,旧的引用将被推送。你不会被推高“半个提交”。

所有文件都以隐式保留任何指针的引用完整性的方式编写。最后写入的文件将是已经包含所有依赖项的引用。

于 2012-11-19T17:46:14.227 回答
2

从理论上讲,可能存在文件不可用的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 后端,这种伪造将变得更加明显。errnoerrno.git/HEAD

所以让我们die()不要在die_errno()这里。
这也将有助于简化refs_resolve_ref_unsafe()API。
这是唯一没有忽略“ failure_errno”输出参数的用户。

于 2017-11-06T21:57:15.983 回答