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_DIR和GIT_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)
如何指定--git-dir.
#!/bin/sh
cd /home/git/www/epicac
git --git-dir=.git pull
Run Code Online (Sandbox Code Playgroud)
没关系...在这里找到它:https://serverfault.com/questions/107608/git-post-receive-hook-with-git-pull-failed-to-find-a-valid-git-directory