如果我在远程挂钩运行时中断本地git进程会发生什么?

3
我在远程服务器上设置了一个“post-receive”钩子,它会检出一个网站的工作副本,安装最新的依赖项,重新构建一些资源,然后重新启动HTTP守护程序。因此,我可以从我的笔记本电脑推送代码以部署网站的最新版本。
但是,这个钩子可能需要一段时间来运行。如果在接收到更改但挂钩还没有完成运行之前,在我的笔记本电脑上Ctrl-C Git Push会发生什么?这个挂钩脚本会被远程中断吗?
2个回答

2
如果在您的电脑上收到更改后,但在钩子完成运行之前按Ctrl-C git push会发生什么?
没有什么特别的。 钩子输出到您的终端会丢失,因此您无法看到它是否有效。 钩子本身仍然运行到完成,如果您编写了一个明智的钩子,它已经在某个地方记录其结果,因为不能保证现在有人正在观看结果,并且如果失败,将知道该怎么做。

0

这取决于推送何时被中断。

在 Git 2.35(2022 年第一季度)中,当 "git push"(man) 命令在接收端尝试报告参考更新提案的情况时被终止,由于 SIGPIPE,后者过去会死亡。
现在的代码忽略了 SIGPIPE,以增加我们在其发生后运行 post-receive 钩子的机会。

请查看提交记录d34182b(2021年11月10日),作者为Robin Jarry(rjarry
(由Junio C Hamano -- gitster --合并于提交记录4f7e2f0,2021年12月15日)

receive-pack:在向客户端报告状态时忽略SIGPIPE信号

签署者:Robin Jarry

在运行 post-receive 钩子之前,会向客户端报告状态信息。
如果远程客户端在状态报告之前或期间退出,则 receive-pack 会被 SIGPIPE 终止,并且 post-receive 永远不会执行。

post-receive 钩子通常用于发送电子邮件通知(参见 contrib/hooks/post-receive-email)、更新 bug 跟踪器、启动自动构建等。
在中断但“成功”推送后未执行它可能导致不一致。

在向客户端报告状态之前忽略 SIGPIPE,以增加 pre-receive 成功后 post-receive 运行的机会。
这并不能保证 100% 的一致性,但应该能够抵抗客户端的早期断开连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接