将 SIGKILL 发送到“git 状态”是否安全?

Is it safe to send a SIGKILL to `git status`?

如果 运行 git status 花费的时间太长,我想停止 Git,但是 Git 似乎忽略了 SIGTERM:Why does timeout not interrupt `git status` when it takes too long?

所以似乎解决这个问题的一种方法是使用 SIGKILL,但是如果您发送 SIGKILL,您可能会遇到错误并损坏您的存储库:

但是,

git status 纯粹是一个查询,所以发送 SIGKILL 不是绝对安全的吗?

由于SIGKILL无法被捕获并立即终止Git,这可能会留下各种奇怪或问题。

Git 被设计为具有相当的弹性:例如,它不只是写出它的索引,而是将更新的索引写入名为 .git/index.lock 的文件,然后使用 [=32] =]意味着成为一个原子OS级进程,在调用新文件.git/index时用.git/index.lock中的新内容替换旧.git/index文件.此原子操作是一个 rename 系统调用:Git 依赖 OS 将其实现为原子操作,要么完全发生,要么永远不会开始。

类似的方案用于更新引用和其他文件,包括松散对象和包文件。并非每个 OS 上的每个文件系统都遵守这些规则,如果 OS 本身崩溃,您可能会遇到各种麻烦的情况,但总的来说它工作得很好。

如果 Git 被杀死,并且无法捕获 SIGKILL,在这些关键部分之一期间会发生什么情况是锁定文件仍然存在。未来的 Git 调用停止并告诉您有一个锁定文件,它无法继续。然后你的工作就是检查整个系统,确定这是否是一个过时的锁,并因此确定它是否可以被删除。如果是这样,删除陈旧的锁并重试操作 应该 恢复。

当 OS 自身崩溃时,Git 可能会丢失 Git 无法运行的文件。解决此类问题的最佳选择是在其他地方建立另一个存储库,最好在物理距离较远的地方,这样一个常见事件(例如,建筑物着火并且其中的所有计算机烧毁或被灭火破坏)不会损坏另一个存储库Git 存储库。对于不太极端的情况,有时存储库可以就地修复。

最常见的失败之一是 OS 完全删除了名为 .git/HEAD 的文件,随着该文件的消失,Git 不再认为存储库是一个存储库。重新创建文件(例如 echo ref: refs/heads/master > .git/HEAD),存储库又回来了。如果您的系统遵守 POSIX 文件原子性规则,即使 SIGKILL.

这种特殊情况也不会发生