我使用gitolite设置了一个中央git repo。
我想设置一个钩子,这样每当用户推送回购时,它会在其他地方执行拉动,然后进行一些自动化测试。
到目前为止,我只想表现它。
在hooks目录中,我在更新后创建了以下脚本名称:
#!/bin/sh
cd /home/git/www/epicac
git pull
当我使用./post-update调用此脚本时,它完全符合我的要求。
但是,每当我挂钩时自动调用它,我得到:致命:不是git存储库:'。'
知道为什么会这样吗?
答案 0 :(得分:27)
您可以按照此SO answer中的建议运行各种诊断程序。
特别是check out the the value of GIT_DIR
and GIT_WORK_TREE
。
当挂钩正在运行时,
GIT_DIR
和(如果无法从GIT_DIR
推断出工作树)GIT_WORK_TREE
已设置。
这意味着您的拉取不会与您更改的目录中的存储库一起运行。
另请参阅博客文章Using Git Inside a Git Hook:
最终我们得到了我们的linux大师,他注意到git用户运行的环境在钩子里面完全不同。
Gitolite对env做了很多事情,但那个让我们搞砸的是GIT_DIR
的设置。
在我们解决之后,解决方案就像:
ENV.delete 'GIT_DIR'
我们的ruby脚本中的由'
post-receive
'钩子触发。
同样的交易 Git Tip: Auto update working tree via post-receive hook,但有一个优雅的方式:
解决方案?
事实证明,post-receive
挂钩开始时GIT_DIR
环境变量设置为repo/.git
文件夹,所以无论你在哪个路径'cd'都会尝试运行任何以下git命令。
解决这个问题只是取消GIT_DIR
的问题 (感谢Ulrich Petri的优雅env -i
解决方案):
#!/bin/sh
cd ..
env -i git reset --hard
答案 1 :(得分:7)
如何指定--git-dir
。
#!/bin/sh
cd /home/git/www/epicac
git --git-dir=.git pull
答案 2 :(得分:1)
没关系......在这里找到它:https://serverfault.com/questions/107608/git-post-receive-hook-with-git-pull-failed-to-find-a-valid-git-directory
答案 3 :(得分:0)
这应该只需一行:
git -C /home/git/www/epicac pull