【问题标题】:Remote Pull via Git Hook takes a really long time通过 Git Hook 远程拉取需要很长时间
【发布时间】:2018-02-15 15:14:19
【问题描述】:

Git 在我们的开发服务器上响应很好,但是当我们执行 git push 时,git hook 会告诉实时服务器执行 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。

【问题讨论】:

  • 你在直播服务器上使用的钩子是什么,是接收后钩子吗?你能展示一下钩子的脚本吗?
  • 这是 post-receive 钩子......:#!/bin/sh read oldrev newrev refname BRANCH=${refname#refs/heads/} if [ "$BRANCH" == "master" ]; then cd //liveserver/SMBWindowsShare/ThisProject unset GIT_DIR echo Debug: git pull start @ "$(date)" git pull origin master # This is what takes 45+ seconds echo Debug: git pull end @ "$(date)" echo Done! fi exit;
  • 我添加了一个答案来更改部分接收后挂钩脚本(改为 unset GIT_DITgit pull origin master)。您可以尝试一下,看看它是否需要更少的秒数。

标签: git version-control githooks


【解决方案1】:

我们的问题是,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 操作和在服务器本地进行操作有很大的不同。

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

【讨论】:

  • 唯一的区别是http.sslbackend=schannel出现在开发服务器上,而不出现在实时服务器上。其他一切都一样
  • @kenneth 好的。我已经用一个可能的替代方案编辑了我的答案。
  • 我明白你的意思,它不是本地拉取,所以它会有滞后,但是当我运行相同的命令从开发服务器拉取到生活时(在实时服务器上git hook 生活),它几乎是瞬时的。所以绝对不是网络卡顿。
【解决方案2】:

要在更改推送到实时服务器后将更改从实时服务器应用到开发服务器,您可以在 if 条件下更改满足条件"$BRANCH" == "master" 的部分 post-receive 钩子脚本。修改部分如下:

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

注意:如果开发服务器和直播有不相关的历史,你可以使用git checkout -f代替。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2017-11-07
    相关资源
    最近更新 更多