繁体   English   中英

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

[英]Git checkout in post-receive hook: “Not a git repository '.'”

我的服务器上有一个非裸存储库(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

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

post-receive挂钩在$GIT_DIR设置为的情况下运行. 这将导致混帐寻找./HEAD./refs/heads/master等,而不是.git/HEAD.git/refs/heads/master ,等等。但是,请你以后不要做任何改变挂钩中的$PWD (无论如何显示),钩子将在.git子目录( /home/andrew/web/.git )中运行,因此这个失败是非常神秘的: . 实际上将是一个有效的git存储库。

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

您显示的后接收挂钩对我来说很好(但有适当的硬编码路径更改)。 然后我再次推出类似Unix的机器,而不是PC。 是否有可能发生其他事情,将目录更改为.git子目录? 你可以echo running in $PWD中做一些像echo running in $PWD一样的东西,看看你在哪里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM