![](/img/trans.png)
[英]Huge Git repository checkout at post-receive hook is extremely slow
[英]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.