【问题标题】:git push with post-receive slowgit push 后接收慢
【发布时间】:2016-05-30 16:40:11
【问题描述】:

我的 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测试了一个push操作,但是延迟是一样的。所以我认为这与我使用的前端无关。
  • 如果我删除 post-receive 脚本,推送操作正常(完全没有延迟)

我做了一些测试,如果 post-receive 脚本包含大约 70 行都被注释掉(所以脚本什么都不做),push 会有大约 5 秒的延迟。

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

更新: 值得一提的是:

  • 我用的是windows7
  • 远程存储库托管在 linux 服务器上,可通过 samba 访问

【问题讨论】:

    标签: git push git-post-receive


    【解决方案1】:

    一个有趣的后续: 我已经在另一台 PC 上测试了脚本,它工作正常。一点都不耽误。所以我的电脑上有一些关于 git 如何处理远程脚本的问题。

    远程存储库位于 samba 共享上。我对 2 个场景进行了 Wireshark 跟踪:

    1. 刚刚在 git bash 中执行了cat <path_to_the_script>\post-receive 命令
    2. 做了real git push

    结果(没有太多技术细节):

    1. 读取 AndX 请求,FID:0x228f,偏移 0 处的 1024 字节(每次 1024 字节,始终)
    2. 读取 AndX 请求,FID:0x21c9,偏移 0 处的 1 个字节(始终为 1 个字节)

    结论: git push 命令以 1 字节块读取 post-receive 脚本

    【讨论】:

    • 我的回复不是答案,因为我仍然使用t know why git processes the post-receive script slowly. I just added it as answer` 而不是comment,因为您无法在comment 中进行正常格式化。
    【解决方案2】:

    来自脚本描述

    # 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 连接,然后超时断开连接。

    【讨论】:

    • 很好的提示,但幸运的是我也在阅读描述:)。所以在我开始测试之前,我已经为我们自己更改了 smtp 服务器配置。同样,如果脚本中没有任何内容只是注释掉了行,则推送会延迟约 5 秒。所以一定是解析post-receive脚本的文本。
    • 我不认为脚本本身的问题,因为它只是 bash 脚本,它在 Unix 平台上具有相当的性能。您是否尝试过从命令行手动运行脚本?
    【解决方案3】:

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

    • oplock = 否
    • level2 oplocks = 否

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

    【讨论】:

    • 优秀。 +1。很高兴知道。那么,不需要我在回答中提到的“异步”方法。
    【解决方案4】:

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

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

    这意味着,在您的情况下,您需要切换到异步方法(除非您可以解决需要时间的问题,例如 Sqeezeranswer,赞成,似乎建议):

    • 让您的脚本在文件中写入它应该做的事情(发送电子邮件)
    • 让一个 cron 作业获取该文件并每隔几分钟执行一次冗长的任务。

    这样,post-receive 钩子会尽快返回,不会阻塞客户端(发起推送的下游 repo)

    【讨论】:

    • 这也是一个很好的提示,但我也对此进行了测试(或类似的东西):我修改了脚本以跳过邮件发送过程(也跳过电子邮件正文的临时文件创建),然后只收集信息(谁在哪个分支上做了什么),延迟大约 15-20 秒。但我有一种感觉,没有邮件发送速度会快一点的真正原因是脚本中要处理的行数更少,而不是因为脚本本身要做的事情更少。
    • @user2448122 这样您就可以按照该提示进行操作,使用单行钩子脚本收集信息并将其写入文件,而 cron 作业脚本包含大部分过程;)
    猜你喜欢
    • 2021-11-28
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2014-06-19
    • 2014-11-11
    • 2014-04-30
    相关资源
    最近更新 更多