从git post-update钩子调用'git pull'

Kev*_*lan 17 git shell githooks

我有一个使用gitolite设置的中央git repo.

我想设置一个钩子,这样每当用户推送到repo时,它会执行其他地方的拉动,然后进行一些自动化测试.

到目前为止,我只想表现它.

在hooks目录中,我在更新后创建了以下脚本名称:

#!/bin/sh  
cd /home/git/www/epicac
git pull
Run Code Online (Sandbox Code Playgroud)

当我使用./post-update调用此脚本时,它完全符合我的要求.

但是,每当我挂钩时自动调用它,我得到:致命:不是git存储库:'.'

知道为什么会这样吗?

Von*_*onC 27

您可以按照此SO答案中的建议运行各种诊断程序.

特别是,检查出的数值GIT_DIRGIT_WORK_TREE.

挂钩正在运行,GIT_DIR并且(如果无法推断出工作树GIT_DIR)GIT_WORK_TREE已设置.
这意味着您的pull不会与您更改的目录中的存储库一起运行.


另请参阅博客帖子在Git Hook中使用Git:

最终我们得到了我们的linux大师,他注意到git用户运行的环境在钩子里面完全不同.
Gitolite对env做了很多事情,但是那个让我们搞砸的事情就是设置了GIT_DIR.
在我们解决之后,解决方案就像:

ENV.delete 'GIT_DIR'
Run Code Online (Sandbox Code Playgroud)

在我们的ruby脚本中,由' post-receive'钩子触发.


Git中的相同优惠提示:通过post-receive钩子自动更新工作树,但优雅的方式是:

解决方案?
事实证明,post-receive钩子开始时GIT_DIR环境变量设置为repo/.git文件夹,所以无论你进入什么路径,它都会尝试在那里运行任何以下的git命令.
解决这个问题仅仅是为了解决问题GIT_DIR
(感谢Ulrich Petri的优雅env -i解决方案):

#!/bin/sh
cd ..
env -i git reset --hard
Run Code Online (Sandbox Code Playgroud)


sat*_*oto 7

如何指定--git-dir.

#!/bin/sh
cd /home/git/www/epicac
git --git-dir=.git pull
Run Code Online (Sandbox Code Playgroud)


Kev*_*lan 1

没关系...在这里找到它:https://serverfault.com/questions/107608/git-post-receive-hook-with-git-pull-failed-to-find-a-valid-git-directory

  • VonC 在他的上述回答中链接了这一点。要么接受你的答案,要么接受他的答案,这样对其他人看这个问题会有帮助 (2认同)