2013-06-12 31 views
1

我的git push操作在25-30秒左右完成,而不是(或多或少)立即返回。 我使用的是相当长后接收(bash)的脚本,I`ve在这里找到:https://raw.github.com/zma/usefulscripts/master/script/post-receivegit push post-receive slow

一些细节:

  • 我的远程仓库是一个局域网服务器,在那里我们有大约70MB的/ (这看起来不错)
  • 这是一个新鲜的存储库,其中只有一个单一的测试文件
  • 我使用git bash,由gitextension(git版本1.7.11.msysgit.1)安装,
  • 我也用gitgui测试了一个push操作,但是th延迟是相同的。所以我认为它与我正在使用的前端无关。
  • 如果我删除后收到脚本,推操作工作好(无延时的话)

我做了一些测试,如果后收到脚本中含有大约70线即都被注释掉了(所以该脚本不做任何事),推迟大约5秒钟。

这是正常的吗? 还是有加快推动的方法吗? 或者我必须戏剧性地缩小脚本大小?

更新: 它提到这一点很重要:

  • 我使用windows7的
  • 远程信息库托管在Linux服务器上,可达通过Samba

回答

1

git hooks page清楚地提到关于post-receive挂钩:

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

这意味着,你的情况,你需要切换到一个异步的方式(除非你能解决什么需要时间,像Sqeezeranswer,upvoted,似乎建议):

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

这样,后收到钩子返回尽可能快地,不阻止客户端(从推已启动,其中下游回购)

+0

这也是一个很好的提示,但我也测试过这个(或类似的东西):我修改了脚本以跳过邮件发送过程(也跳过电子邮件正文的临时文件创建),然后收集信息(谁在什么分支上做了什么),延迟大约是15-20秒。但是我有一种感觉,没有邮件发送的速度变得更快的真正原因是脚本中的行数不足以处理,而不是因为脚本本身的事情少。 – user2448122

+0

@ user2448122,所以你可以按照这个提示,用一行钩子脚本收集信息并将其写入文件,而cron作业脚本包含该过程的大部分;) – VonC

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进行连接,然后只是超时断开。

+0

+1。比我自己的回答更实用的方法。 – VonC

+0

好的提示,但幸运的是我也阅读说明:)。所以在我开始测试之前,我已经改变了我们自己的smtp服务器配置。再一次,如果脚本中没有任何内容只是注释掉了这些行,那么推迟会延迟~5秒。所以它必须是解析post-receive脚本文本的东西。 – user2448122

+0

我不认为脚本本身存在这个问题,因为它只是bash脚本,它在Unix平台上有公平的性能。你有没有试过用命令行手动运行脚本? – Sqeezer

2

一个有趣的后续: 我测试过另一台PC上的脚本,它工作正常。根本没有延迟。所以我的电脑上有一些关于如何处理远程脚本的问题。

远程存储库位于samba共享上。我花了Wireshark的痕迹有2种情况:

  1. 只是在git的庆典
  2. 做了real混帐推

结果(没有太多的技术细节)执行cat <path_to_the_script>\post-receive命令:

  1. 读取AndX请求,FID:0x228f,偏移量为0的1024字节(始终为1024字节)
  2. Re广告和X请求,FID:0x21c9,1个字节偏移量0(1字节,总是)

结论: 混帐推命令读取1字节块

+0

如果您自己回答了问题,请务必将其标记为已回答! – RyPeck

+0

我的回复不是答案,因为我仍然不知道为什么git会缓慢处理接收后脚本。我只是将它添加为'answer'而不是'comment',因为您无法在'comment'中执行正常格式。 – user2448122

1

的,收到后脚本原来的samba共享配置为不使用机会锁与在smb.conf以下选项:

  • 机会锁=否
  • level2的机会锁=否

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

+0

非常好。 +1。很高兴知道。那么我就不需要在我的答案中提到的“异步”方法。 – VonC