git push with post-receive slow

时间:2013-06-12 06:26:45

标签: git push git-post-receive

我的git push操作在大约25-30秒内完成,而不是(或多或少)立即返回。 我正在使用我在这里找到的一个很长的收件后(bash)脚本:https://raw.github.com/zma/usefulscripts/master/script/post-receive

一些细节:

  • 我的远程存储库位于LAN服务器上,我们有大约70MB / s的读/写访问权限(这看起来没问题)
  • 这是一个新的存储库,其中只有一个测试文件
  • 我正在使用由gitextension安装的git bash(git版本1.7.11.msysgit.1)
  • 我还测试了gitgui的推送操作,但延迟是相同的。所以我认为这与我正在使用的前端无关。
  • 如果我删除了收件后脚本,推送操作就可以了(完全没有延迟)

我做了一些测试,如果接收后脚本包含大约70行已注释掉(因此脚本什么都不做),推送会有大约5秒的延迟。

这是正常的吗? 或者有没有办法加快推动? 或者我必须大幅减少脚本大小?

更新 重要的是要提到:

  • 我正在使用windows7
  • 远程存储库托管在Linux服务器上,可通过samba
  • 访问

4 个答案:

答案 0 :(得分:2)

一个有趣的跟进: 我已经在另一台PC上测试了脚本,它运行正常。没有延迟。因此,我的电脑上存在一些关于git如何处理远程脚本的问题。

远程存储库位于samba共享上。我采用了两种方案的wireshark跟踪:

  1. 刚刚在git bash中执行cat <path_to_the_script>\post-receive命令
  2. 做了real git push
  3. 结果(没有太多技术细节):

    1. 读取AndX请求,FID:0x228f,偏移0处的1024字节(始终为1024字节)
    2. 读取AndX请求,FID:0x21c9,偏移0处的1个字节(始终为1个字节)
    3. 结论: git push命令以1字节块的形式读取接收后脚本

答案 1 :(得分:1)

git hooks page明确提及post-receive钩子:

  

此脚本无法停止推送过程,但客户端在完成之前不会断开连接;所以,当你尝试做任何可能需要很长时间的事情时要小心。

这意味着,在您的情况下,您需要切换到异步方法(除非您可以修复需要时间的内容,例如Sqeezeranswer,upvoted,似乎建议):

  • 使您的脚本在文件中写入应该执行的操作(发送电子邮件)
  • 让cron作业接受该文件并每隔几分钟执行一次冗长的任务。

这样,post-receive hook尽可能快地返回,而不是阻塞客户端(从推出的推送位置开始的下游repo)

答案 2 :(得分:1)

从剧本描述

# An example hook script to mail out commit update information.  This hook
# sends emails listing new revisions to the repository introduced by the
# change being reported.  The rule is that (for branch updates) each commit
# will appear on one email and one email only.

然后看一下脚本的底部。它说:

# Note: change the smtp server to yours
        cat $email_tmp_file | mailx -S smtp="smtp://smtp.cse.ust.hk" -s "$emailsubject" -r $senderemail $recipients 

我相信您尚未配置smtp服务器,因此您的脚本正在等待smtp.cse.ust.hk连接,然后只是超时断开连接。

答案 3 :(得分:1)

事实证明,samba共享被配置为不在smb.conf中使用具有以下选项的oplock:

  • oplock =否
  • level2 oplocks =否

从共享配置中删除这些条目会将接收后执行的延迟减少到大约4-5秒,这是合理的。