为什么这个路径有时不是 git 存储库?

为什么这个路径有时不是 git 存储库?

我有一个 git hook ( post-receive) 来更新文档、运行单元测试等,但有时无法正常工作。

以下是钩子的内容post-receive

#!/usr/bin/bash
~/bubblegum_ci > /tmp/bubblegum_ci_log 2>&1 &

这并不难理解,只需在后台启动一个脚本并将 stdout 和 stderr 通过管道传输到日志文件即可。

以下是 bubblegum_ci 的内容:

#!/usr/bin/bash
id
cd /home/git/bubblegum
pwd
GIT_CURL_VERBOSE=1 GIT_TRACE=1 git pull -v .
make genhtml doxygen

这个也很简单;只需 cd 到另一个存储库,提取任何更改,然后调用make来处理实际工作。有时效果很好。有时,脚本会给出以下输出:

uid=1001(git) gid=1001(git) groups=1001(git),1002(www)
/home/git/bubblegum
fatal: not a git repository: '.'
make genhtml doxygen
<the output from make showing that the commits I just pushed have not been pulled>

第一行/home/git/bubblegum显然是 的输出pwd,但是 git 无法拉取,说它不是 git 存储库。我对这有时有效有时无效这一事实感到困惑。这里有人能解释一下这个问题吗?是否存在我没​​有发现的竞争条件?否则我有兴趣看看是否有更好的方法来处理这种事情。

以下是 /home/git/bubblegum/.git 的权限:

git@fancy-server:~$ ls /home/git/bubblegum -al | grep \\.git
drwxr-xr-x  8 git git   4096 Sep  2 09:58 .git

这是输出ls -l /home/git/bubblegum/.git/

$ ls -l .git
total 52
-rw-r--r--   1 git git   84 Sep  2 09:58 FETCH_HEAD
-rw-r--r--   1 git git   23 Aug 31 15:42 HEAD
-rw-r--r--   1 git git   41 Sep  2 09:58 ORIG_HEAD
drwxr-xr-x   2 git git 4096 Aug 31 15:42 branches
-rw-r--r--   1 git git  251 Aug 31 15:42 config
-rw-r--r--   1 git git   73 Aug 31 15:42 description
drwxr-xr-x   2 git git 4096 Aug 31 15:42 hooks
-rw-r--r--   1 git git 1875 Sep  2 09:52 index
drwxr-xr-x   2 git git 4096 Aug 31 15:42 info
drwxr-xr-x   3 git git 4096 Aug 31 15:42 logs
drwxr-xr-x 151 git git 4096 Sep  2 09:52 objects
-rw-r--r--   1 git git  114 Aug 31 15:42 packed-refs
drwxr-xr-x   5 git git 4096 Aug 31 15:42 refs

这里 si 的输出mount | grep home

/dev/sda6 on /home type ext4 (rw,relatime) 

答案1

问题与环境变量有关。这里的线索是它在命令行上工作,而不是在任何运行 git hook 的环境中工作。

所以我将env命令放入脚本中,并注意到GIT_DIR="."。这解释了神秘的错误消息fatal: not a git repository: '.'。果然,设置 GIT_DIR 是一回事,并且有一个命令行选项可以覆盖环境变量。

还要感谢 Raphael Ahrens,他在评论中指出了命令末尾的错误句号git pull .。执行拉取的命令现在看起来像这样git --git-dir="/home/git/bubblegum/.git/" pull -v,而且似乎做得很好。

相关内容