带post接收的git推送速度慢

带post接收的git推送速度慢,git,push,git-post-receive,Git,Push,Git Post Receive,我的git推送操作大约在25-30秒内完成,而不是或多或少立即返回。 我正在使用一个很长的post receive bash脚本,我在这里找到了这个脚本: 一些细节: 我的远程存储库位于一个LAN服务器上,在那里我们有大约70MB/s的读/写访问权限这看起来还可以 这是一个新的存储库,其中只有一个测试文件 我使用的是GitBash,由GitExtensionGitVersion1.7.11.msysgit.1安装 我还用gitgui测试了一个推送操作,但是延迟是一样的。因此,我认为它与我使用的前

我的git推送操作大约在25-30秒内完成,而不是或多或少立即返回。 我正在使用一个很长的post receive bash脚本,我在这里找到了这个脚本:

一些细节:

我的远程存储库位于一个LAN服务器上,在那里我们有大约70MB/s的读/写访问权限这看起来还可以 这是一个新的存储库,其中只有一个测试文件 我使用的是GitBash,由GitExtensionGitVersion1.7.11.msysgit.1安装 我还用gitgui测试了一个推送操作,但是延迟是一样的。因此,我认为它与我使用的前端无关。 如果我删除接收后脚本,推送操作可以正常工作,没有任何延迟 我做了一些测试,如果post-receive脚本包含大约70行都被注释掉了,所以脚本什么也不做,push会有大约5秒的延迟

这正常吗? 或者有没有办法加快推进速度? 或者我必须大幅减小脚本大小

更新: 必须指出的是:

我正在使用windows7 远程存储库托管在linux服务器上,可通过samba访问 该文件明确提到了post接收挂钩:

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

这意味着,在您的情况下,您需要切换到异步方法,除非您能够解决需要时间的问题,如的建议:

让你的脚本写在一个文件中它应该做什么发送电子邮件 让cron作业处理该文件并每隔几分钟执行一次冗长的任务。 这样,post接收钩子会尽快返回,不会阻止推送启动的客户下游回购

明确提到post接收钩子:

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

这意味着,在您的情况下,您需要切换到异步方法,除非您能够解决需要时间的问题,如的建议:

让你的脚本写在一个文件中它应该做什么发送电子邮件 让cron作业处理该文件并每隔几分钟执行一次冗长的任务。
这样,post-receive钩子将尽可能快地返回,而不会阻止从脚本描述中启动推送的客户端下游回购

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

来自脚本描述

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

有趣的后续内容: 我已经在另一台电脑上测试了这个脚本,效果很好。一点也不耽搁。因此,在我的电脑上有一些关于git如何处理远程脚本的问题

远程存储库位于samba共享上。我拍摄了两个场景的wireshark跟踪:

刚刚在git bash中执行了cat\post receive命令 做了一个真正的傻事 没有太多技术细节的结果:

读取AndX请求,FID:0x228f,偏移量0处1024字节每次1024字节,始终 读取AndX请求,FID:0x21c9,偏移量0处1字节,始终 结论: git push命令以1字节的块读取接收后脚本

一个有趣的后续操作: 我已经在另一台电脑上测试了这个脚本,效果很好。一点也不耽搁。因此,在我的电脑上有一些关于git如何处理远程脚本的问题

远程存储库位于samba共享上。我拍摄了两个场景的wireshark跟踪:

刚刚在git bash中执行了cat\post receive命令 做了一个真正的傻事 没有太多技术细节的结果:

读取AndX请求,FID:0x228f,偏移量0处1024字节每次1024字节,始终 读取AndX请求,FID:0x21c9,偏移量0处1字节,始终 结论:
git push命令以1字节的块读取接收后脚本

结果是samba共享被配置为不使用oplock,smb.conf中有以下选项:

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

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

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

好提示,但幸运的是我也在阅读说明:。所以我改变了主意
在我开始测试之前,我们自己的smtp服务器配置。同样,如果脚本中没有注释掉的行,则推送延迟约5秒。因此,这一定是关于解析post receive脚本的文本的问题。我不认为这是脚本本身的问题,因为它只是bash脚本,在Unix平台上具有良好的性能。您是否尝试过从命令行手动运行脚本?这是一个很好的提示,但幸运的是,我也在阅读描述:。因此,在开始测试之前,我已经更改了我们自己的smtp服务器配置。同样,如果脚本中没有注释掉的行,则推送延迟约5秒。因此,这一定是关于解析post receive脚本的文本的问题。我不认为这是脚本本身的问题,因为它只是bash脚本,在Unix平台上具有良好的性能。你有没有试过从命令行手动运行脚本?这也是一个很好的技巧,但我也测试过这个或类似的东西:我修改了脚本,跳过了邮件发送过程,也跳过了邮件正文的临时文件创建,只收集了谁在哪个分支上做了什么的信息,延迟大约15-20秒。但我有一种感觉,没有邮件发送速度更快的真正原因是脚本中要处理的行数更少,而不是因为脚本本身要做的事情更少。@user2448122所以您可以遵循这个技巧,使用单行钩子脚本收集信息并将其写入文件,而cron作业脚本包含了大部分流程;这也是一个很好的提示,但我也测试过这个或类似的东西:我修改了脚本,跳过了邮件发送过程,也跳过了邮件正文的临时文件创建,只收集了谁在哪个分支上做了什么的信息,延迟大约为15-20秒。但我有一种感觉,没有邮件发送速度更快的真正原因是脚本中要处理的行数更少,而不是因为脚本本身要做的事情更少。@user2448122所以您可以遵循这个技巧,使用单行钩子脚本收集信息并将其写入文件,而cron作业脚本包含了大部分流程;我的回答不是答案,因为我仍然不知道为什么git处理PostReceive脚本的速度很慢。我只是将其添加为“回复”,而不是一条评论,因为你无法在评论中进行正常的格式设置。我的回复不是答案,因为我仍然不知道git为什么处理post receive脚本的速度很慢。我只是把它作为答案而不是一条评论,因为你不能在评论中使用正常的格式。太好了+1.很高兴知道。不需要我在回答中提到的异步方法,太好了+1.很高兴知道。那么,就不需要我在回答中提到的异步方法了。