post-receive hook中的Git checkout:“不是git存储库'。'”

时间:2012-05-08 23:29:51

标签: git

我的服务器上有一个非裸存储库(dirs / home / andrew / web和/home/andrew/web/.git),设置receive.denyCurrentBranch忽略并创建post-receive hook:

#!/bin/sh
GIT_WORK_TREE=/home/andrew/web git checkout -f

当我运行sh .git / hooks / post-receive时,一切正常。但是,当我从电脑上推出时,我收到了这个错误:

remote: fatal: Not a git repository: '.'

有什么方法可以解决这个问题?最终无需切换裸仓库?

谢谢

编辑:这是我的新收件后挂钩。为什么在接受的答案中描述了这一点。

echo "\nChecking out $PWD"
GIT_DIR=/home/andrew/web/.git
GIT_WORK_TREE=/home/andrew/web git checkout -f

1 个答案:

答案 0 :(得分:27)

[编辑,2017年2月:这个旧的答案仍然受到一些打击,所以让我们添加几个笔记。 (1)这种实时更新通常是一个坏主意:确保你知道为什么要这样做,并且你不会破坏自己的工作。 (2)在2.3版本的Git中,您现在可以将receive.denyCurrentBranch配置为updateInstead,并在Git 2.4及更高版本中进行钩子调整。有关详细信息,请参阅the git config documentation。]

$GIT_DIR设置为.的情况下运行收发后挂钩。这会导致git查找./HEAD./refs/heads/master等,而不是.git/HEAD.git/refs/heads/master等。但是,因为您没有做任何事情要更改{{在钩子中(如图所示),钩子将在$PWD子目录(.git)中运行,因此这种失败是非常神秘的:/home/andrew/web/.git实际上是一个有效的git存储库。

避免对路径名进行硬编码的一个标准技巧是使用.作为后接收挂钩。这是cd ..; git checkout -f的设置成为问题的地方,因为在$GIT_DIR挂钩运行之后(仍然假设这种情况)cd ..当然,此时/home/andrew/web应该是$GIT_DIR而不是.git。标准修复只是取消设置.(将其设置为GIT_DIR也可以。)

如图所示,您的post-receive挂钩对我来说很好(具有适当的硬编码路径更改)。然后我再次推出类似Unix的机器,而不是PC。是否有可能发生其他事情,将目录更改为.git子目录?您可以在钩子中执行类似.git的操作,以查看您的位置。