【问题标题】:Which signals can safely be used to kill a Git process and which not?哪些信号可以安全地用于终止 Git 进程,哪些不能?
【发布时间】:2012-05-07 18:43:36
【问题描述】:
  • 哪些信号是安全的,哪些不是?

  • 对于那些不安全的信号,杀死 Git 进程会造成哪些损害?工作树可能处于未定义状态吗? .git/index 甚至 .git/objects-database 可能会损坏吗?

  • 文件是由 Git 以某种“原子”操作编写的吗? (工作树文件、.git/index、配置文件等等……)

更新:关于信号的更精确问题

【问题讨论】:

  • 你可以更精确。你究竟会发送哪个信号来阻止它?我确定 SIGINT 没问题(就像命令行上的 ^C 一样),但可能不是 SIGKILL 或 SIGSEGV。
  • @Artefact2:谢谢,我已经制定了关于信号更精确的问题。

标签: git process


【解决方案1】:

实际上,git 非常努力地尝试完全事务性 - 即它试图从不使存储库处于不一致的状态,无论何时或如何中断操作 - 请参阅此问题: Can a git repository be corrupted if a command modifying it crashes or is aborted?

因此,如果使用 SIGTERM、SIGKILL 或红色电源按钮,如何终止 git 进程并不重要。如上面的答案所述,例外情况是工作目录中的文件可能是来自不同分支的文件的混合,因为这些文件不能一次全部替换。

也就是说,交易安全性很难测试(因为有很多极端情况),所以我不会 100% 依赖 git 在这种情况下是安全的。您通常应该没问题,但是您可能不时遇到错误并弄乱存储库。

【讨论】:

  • 那么你的意思是,假设实现没有错误,Git 的设计方式是,如果存储库完全事务性和工作树几乎(除了提到的例外),那么 Git 的设计方式是?
  • @mstrap:是的(实际上,不是我说的,而是 Jan Hudec,他写了链接的答案)。
【解决方案2】:

这取决于你试图杀死它时 GIT 正在做什么。

如果你在克隆过程中杀死它,它肯定会处于部分不完整的状态,但很容易从中恢复:删除凌乱的部分克隆并再次克隆。

根据我的经验,当 GIT 失败时,它不会杀死它正在管理的文件。我之前在推送过程中将其杀死,而对我更改的文件没有太大损坏。当然,消息日志可能会有些混乱。

没有比你提供的更详细的信息,很难说。

【讨论】:

  • @mstrap 你什么时候杀死 GIT?在提交、推送、拉取、变基期间?或者您只是想知道一般会发生什么?
  • @kevin268 我计划在任何操作期​​间从用户界面中根据用户请求(例如,关闭窗口时)杀死 Git。我应该允许这样做吗?
  • @mstrap 杀死任何应用程序应该是最后的手段。如果我是你,我会尝试设计我的应用程序,以便不需要强制终止应用程序。通常有一种更优雅的方式来结束应用程序,通过应用程序自己的 API 或操作系统的服务管理器。
  • @kevin268 谢谢凯文,我知道这一点。仍然对于我的情况,最好杀死 Git 而不是让它在后台运行,做一些用户可能不知道的事情。当然,这只有在可以安全杀死的情况下才成立。
  • @kevin628 正常关机并不总是可行的。比较lwn.net/Articles/191059
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
相关资源
最近更新 更多