我有一个使用gitolite设置的中央git repo。
我想设置一个钩子,这样每当用户推动回购时,它就会在其他地方执行拉操作,然后进行一些自动测试。
到目前为止,我只想让它做牵引。
在hooks目录中,我创建了以下更新后的脚本名:
#!/bin/sh
cd /home/git/www/epicac
git pull
当我使用./post update调用此脚本时,它完全按照我的需要执行。
但是,每当它在我挂接时被自动调用时,我会得到:致命的:而不是Git存储库:“”。
知道为什么会这样吗?
最佳答案
您可以按照此SO answer中的建议运行各种诊断。
尤其是,check out the the value of GIT_DIR
and GIT_WORK_TREE
。
当钩子运行时,会设置GIT_DIR
和(如果无法从GIT_DIR
推断工作树)。
这意味着您的请求不会与您更改到的目录中的存储库一起运行。
另见博客帖子:
最终我们找到了我们的Linux专家,他注意到Git用户运行的环境在钩子中是完全不同的。
Gitolite对env做了很多事情,但把我们搞砸的是设置了GIT_WORK_TREE
。
在我们发现这一点后,解决方案就简单到:
ENV.delete 'GIT_DIR'
在我们的ruby脚本中,它是由钩子触发的。
同样的交易,但有一种优雅的方式:
解决方案?
结果发现,钩子从设置到文件夹的环境变量开始,所以无论您“cd”进入哪个路径,它都会尝试在那里运行任何下面的git命令。
修复此问题只需取消设置
GIT_DIR
(感谢Ulrich Petri提供优雅的
post-receive
解决方案):#!/bin/sh
cd ..
env -i git reset --hard
关于git - 从git post-update钩子(Hook)调用'git pull',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3542854/