20

I have a central git repo set up using gitolite.

I want to set up a hook such that whenever a user pushes to the repo, it performs a pull elsewhere followed by some automated testing.

So far, I only want to it perform the pull.

In the hooks directory I created the following script names post-update:

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

When I invoke this script using ./post-update, it does exactly what I want.

However, whenever it's invoked automatically as I hook, I get: fatal: Not a git repository: '.'

Any idea why this might be happening?

4

4 回答 4

28

您可以按照此SO answer中的建议运行各种诊断程序。

特别是检查 和 的GIT_DIRGIT_WORK_TREE

在钩子运行时,GIT_DIR并且(如果无法从中推断出工作树GIT_DIRGIT_WORK_TREE已设置。
这意味着您的 pull 不会与您更改到的目录中的存储库一起运行。


另请参阅博客文章在 Git Hook 中使用 Git

最终我们找到了我们的 linux 大师,他注意到 git 用户运行的环境在 hook 中是完全不同的。
Gitolite 对 env 做了很多事情,但让我们搞砸的是GIT_DIR.
在我们弄清楚之后,解决方案很简单:

ENV.delete 'GIT_DIR'

post-receive在我们的 ' ' 钩子触发的 ruby​​ 脚本中。


Git 提示中的相同交易:通过 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
于 2010-08-22T19:11:54.703 回答
7

如何指定--git-dir.

#!/bin/sh
cd /home/git/www/epicac
git --git-dir=.git pull
于 2012-02-15T06:00:55.407 回答
1

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

于 2010-08-22T19:07:34.790 回答
0

这应该只用一行就可以解决问题:

git -C /home/git/www/epicac pull
于 2016-02-02T15:54:05.393 回答