post-receive hook中的Git checkout:"不是git存储库'.'"

A12*_*321 19 git

我有一个非纯仓库在我的服务器(目录/家用/安德鲁/网络和/home/andrew/web/.git),设置receive.denyCurrentBranch忽略和创建,接收后钩:

#!/bin/sh
GIT_WORK_TREE=/home/andrew/web git checkout -f
Run Code Online (Sandbox Code Playgroud)

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

remote: fatal: Not a git repository: '.'
Run Code Online (Sandbox Code Playgroud)

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

谢谢

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

echo "\nChecking out $PWD"
GIT_DIR=/home/andrew/web/.git
GIT_WORK_TREE=/home/andrew/web git checkout -f
Run Code Online (Sandbox Code Playgroud)

tor*_*rek 27

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

post-receive挂钩运行时$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在钩子里做一些事情,看看你在哪里.

  • 我收到的"未设置的GIT_DIR"为我工作. (3认同)
  • 将`$ GIT_DIR`设置为`.git`和`cd`ing为我工作的目录.谢谢! (2认同)