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

时间:2010-08-22 18:51:56

标签: git shell githooks

我使用gitolite设置了一个中央git repo。

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

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

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

#!/bin/sh  
cd /home/git/www/epicac
git pull

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

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

知道为什么会这样吗?

4 个答案:

答案 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)

答案 3 :(得分:0)

这应该只需一行:

git -C /home/git/www/epicac pull