1

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

一些细节:

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

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

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

更新: 重要的是要提到:

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

4 回答 4

2

一个有趣的跟进:我已经在另一台 PC 上测试了脚本,它运行良好。一点都不耽误。所以我的电脑上有一些关于 git 如何处理远程脚本的问题。

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

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

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

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

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

于 2013-06-12T14:14:10.987 回答
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连接,然后超时断开。

于 2013-06-12T06:45:17.510 回答
1

git hooks 页面清楚地提到了钩子post-receive

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

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

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

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

于 2013-06-12T06:44:49.810 回答
1

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

  • oplock = 否
  • level2 oplocks = 否

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

于 2013-06-13T13:55:51.467 回答