我们将 git 与中央仓库一起使用(使用 Gitosis)。我创建了一个 post-receive 挂钩,用于在将更改推送到中央存储库时向开发邮件列表生成一封电子邮件,并从 git 存储库中的文档文件夹生成文档。
因此,在 ~git/ 中,我有一个目录,我们将其称为“a”,其中包含 git 存储库的克隆。接收后挂钩如下所示:
#!/bin/bash
cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( cd ~git/a && git pull &> ~git/pull_log.log && php ~git/a/scripts/generate_markdown_documentation.php &> ~git/doc_log.log )
电子邮件脚本正在运行,但文档生成却没有。pull_log.log 的内容是:
fatal: Not a git repository: '.'
这让我认为它没有更改为上述脚本第 5 行中的正确目录。我错了吗?我怎样才能让它工作?
编辑:我已经按照回复中的建议更新了接收后挂钩。脚本现在是:
#!/bin/bash
function die {
echo "$*" >&2; exit 1
}
function checkgit {
[ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
}
cd ~git/repositories/a.git
. ~git/post-receive-email &> /dev/null
( set -x
checkgit ~git/a
cd ~git/a
checkgit .
pwd
git pull
php ~git/a/scripts/generate_markdown_documentation.php )
我从 git push 得到以下输出:
+ checkgit /var/git/a
+ '[' -d /var/git/a/.git ']'
+ cd /var/git/a
+ checkgit .
+ '[' -d ./.git ']'
+ pwd
/var/git/a
+ git pull
fatal: Not a git repository: '.'
+ php /var/git/a/scripts/generate_markdown_documentation.php
还有什么帮助吗?
哦,如果我自己运行脚本,它就可以工作(我通过说 hooks/post-receive 来运行它)
发现了问题,这要归功于serverfault - 基本上,环境变量GIT_DIR
和GIT_WORK_TREE
钩子运行时设置,这些对 git pull 产生不利影响。取消设置变量可以解决问题。