我有一个 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
,而且似乎做得很好。