gpt4 book ai didi

接收后 Hook 中的 Git checkout : "Not a git repository ' .'"

转载 作者:IT王子 更新时间:2023-10-29 01:22:07 26 4
gpt4 key购买 nike

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

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

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

remote: fatal: Not a git repository: '.'

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

谢谢

编辑:这是我新的接收后 Hook 。为什么会这样已在已接受的答案中进行了描述。

echo "\nChecking out $PWD"
GIT_DIR=/home/andrew/web/.git
GIT_WORK_TREE=/home/andrew/web git checkout -f

最佳答案

[编辑,2017 年 2 月:这个旧答案仍然有点问题,所以让我们添加一些注释。 (1) 这种实时更新通常不是一个好主意:确保你知道你为什么这样做,并且你不会破坏你自己的工作。 (2) 在 Git 2.3 之后,您现在可以将 receive.denyCurrentBranch 配置为 updateInstead,并在 Git 2.4 及更高版本中进行 Hook 调整。有关详细信息,请参阅 the git config documentation .]

接收后 Hook 在 $GIT_DIR 设置为 . 的情况下运行。这导致 git 寻找 ./HEAD./refs/heads/master 等,而不是 .git/HEAD.git/refs/heads/master 等。但是,由于您没有对 Hook 中的 $PWD 做任何更改(无论如何显示), Hook 将是运行在.git子目录(/home/andrew/web/.git),因此这个失败比较神秘:. will in fact 是一个有效的 git 存储库。

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

不过,如图所示,您的接收后 Hook 对我来说效果很好(通过适当的硬编码路径更改)。然后我再次从类 Unix 机器而不是 PC 推送。是否有可能发生其他事情,将目录从 .git 子目录中更改出来?您可以在 Hook 中执行类似 echo running in $PWD 的操作,以查看您的位置。

关于接收后 Hook 中的 Git checkout : "Not a git repository ' .'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10507942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com