Git-带有git pull的接收后钩子“未能找到有效的git目录”


17

这很奇怪,但是在设置git存储库并创建带有以下内容的接收后钩子时:

echo "--initializing hook--"
cd ~/websites/testing
echo "--prepare update--"
git pull
echo "--update completed--"

钩子确实可以运行,但是它永远无法正常运行git pull:

6bfa32c..71c3d2a  master -> master
--initializing hook--
--prepare update--
fatal: Not a git repository: '.'
Failed to find a valid git directory.
--update completed--

所以我现在问自己,如何使挂钩在接收后更新克隆?

在这种情况下,运行进程的用户是相同的,并且所有内容都在用户文件夹中,所以我真的不明白...因为如果我手动进入

cd ~/websites/testing
git pull

它没有任何问题...

任何帮助,将不胜感激

非常感谢

Answers:


25

在挂钩运行时,将设置GIT_DIR和(如果工作树是显式定义的)GIT_WORK_TREE。这意味着您的拉取将不会与您更改到的目录中的第二个存储库一起运行。

尝试git --git-dir ~/websites/testing/.git --work-tree ~/websites/testing pull; 或使用以下命令取消设置git的repo-local环境:

unset $(git rev-parse --local-env-vars)

有关这些环境变量的更多信息,请参见man 1 git


1
非常感谢Tobu,它确实有效,我也将查看有关它的更多信息。干杯
zanona

6

我遇到的一件事是,使用post-update钩子'--git-dir'效果很好,但是git仍然抱怨缺少工作树(尽管使用'--work-tree')

简而言之,这行不通:

git --git-dir /path/to/websites/testing/.git --work-tree /path/to/websites/testing pull

而这工作:

cd /path/to/websites/testing
git --git-dir /path/to/websites/testing/.git pull


1

这不行吗?

cd /home/smb/websites/testing
env -i git pull

已编辑

更好的是

cd /home/smb/websites/testing
unset GIT_DIR
git pull

0

您是否尝试使用完整路径而不是〜?

cd /home/smb/websites/testing
git pull

0

该脚本可能是用调用的/bin/sh,它无法理解~。尝试使用完整路径~代替。


0

第一个推荐的答案是正确的-当一个钩子正在运行GIT_DIR时,将被设置。但是,如果您希望能够在另一个存储库中使用该脚本,则该方法存在缺陷,因为它对重置GIT_DIR进行了硬编码。正如他们所暗示的那样,另一种方法是通过使用env来删除变量,如下所示:env -i git reset --hard显然,在那儿运行的命令由您决定-只是“ env -i”位是重要的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.