我的服务器上有一个非裸存储库(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
答案 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
的操作,以查看您的位置。