接收后钩子中的 Git 结帐:"Not a git repository '.'"

  • 本文关键字:Not git repository 结帐 Git git
  • 更新时间 :
  • 英文 :


我的服务器上有一个非裸存储库(dirs/home/andrew/web 和/home/andrew/web/.git(,将receive.denyCurrentBranch设置为忽略并创建了接收后钩子:

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

当我运行 sh .git/hooks/post-receive 时,一切正常。但是当我从PC推送时,出现此错误:

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

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

接收后挂钩在$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(将其设置为 .git 也可以(。

不过,如图所示,您的接收后钩子对我来说效果很好(通过适当的硬编码路径更改(。 然后,我又是从类Unix的机器而不是PC推动的。 是否有可能发生其他事情,将目录从.git子目录中更改出来? 你可以做一些类似echo running in $PWD钩子的事情,看看你在哪里。

相关内容

最新更新