通过Git Hook进行远程拉动需要很长时间

时间:2017-09-07 02:25:10

标签: git version-control githooks

Git在我们的开发服务器上响应很好,但是当我们执行git push时,git钩子告诉实时服务器执行git pull来发布在该步骤中已经在开发服务器上推送的所有内容。我们的问题是,git hook需要大约45秒来从实时服务器执行git pull,但是当我们在实时服务器上手动执行git pull时,它几乎是即时的。

打开调试时间戳,这是一个例子:

$ git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 435 bytes | 217.00 KiB/s, done.
Total 5 (delta 4), reused 0 (delta 0)
remote: Checking connectivity: 5, done.
remote: Debug: set branch start @ Wed, Sep  6, 2017 10:12:28 PM
remote: Debug: set branch end @ Wed, Sep  6, 2017 10:12:28 PM
remote: GIT pull master on live server...
remote: Debug: cd start @ Wed, Sep  6, 2017 10:12:28 PM
remote: Debug: cd end @ Wed, Sep  6, 2017 10:12:28 PM
remote: Debug: unset git_dir start @ Wed, Sep  6, 2017 10:12:28 PM
remote: Debug: unset git_dir end @ Wed, Sep  6, 2017 10:12:28 PM
remote: Debug: git pull start @ Wed, Sep  6, 2017 10:12:28 PM
remote: From //liveserver/GIT/repos/ThisProject
remote:  * branch              master     -> FETCH_HEAD
remote:    6434be6e..f6c6e04d  master     -> origin/master
remote: Updating 6434be6e..f6c6e04d
remote: Fast-forward
remote:  applications/the_changed_file.php | 2 +-
remote:  1 file changed, 1 insertion(+), 1 deletion(-)
remote: Debug: git pull end @ Wed, Sep  6, 2017 10:13:14 PM
remote: Done!
To //liveserver/GIT/repos/ThisProject.git
   6434be6e..f6c6e04d  master -> master

我们完全不知道如何才能让它加速到接近直接从直播服务器运行git pull所需的时间。我们可以做些什么来解决这个问题?

我们在开源和现场服务器上使用Windows Server上的Git Bash。

2 个答案:

答案 0 :(得分:0)

  

我们的问题是,git hook大约需要45秒来从实时服务器执行git pull,但是当我们在实时服务器上手动执行git pull时,它几乎是瞬间完成的。

确保您的钩子在文本文件中执行时保存环境变量

#!/bin/bash
env>envs.txt

将那些与您在服务器上执行命令时所看到的那些进行比较:

set>envs2.txt

在两种情况下对git config -l执行相同的操作。

使用PATH或git配置的差异可能会解释为什么它在一种情况下如此缓慢而在另一种情况下却不是这样。

另请务必使用latest Git for Windows available

  

我们的问题是,git hook大约需要45秒来从实时服务器执行git pull,但是当我们在实时服务器上手动执行git pull时,它几乎是瞬间完成的。

cd //liveserver/SMBWindowsShare/ThisProject 
unset GIT_DIR 
git pull origin master

通过共享驱动器执行git操作与在服务器上本地执行git操作之间存在很大差异。

最好是你可以留下一个标志(比如写一个tmp文件)然后由远程服务器本身上运行的进程拾取:每次它看到tmp文件时,它会删除它, git pull并编写另一个你自己挂钩的tmp文件可以等待 这样,拉取过程直接在服务器上完成(不涉及远程延迟)

答案 1 :(得分:0)

要在将更改推送到实时服务器后将更改从实时服务器应用到开发服务器,您可以在if条件下更改符合条件"$BRANCH" == "master"的部分接收后挂钩脚本。更改的部分如下:

git --work-tree=/path/to/development/server --git-dir=/path/to/live/server pull origin master

注意:如果开发服务器和实时具有不相关的历史记录,则可以使用git checkout -f代替。