Sil*_*der 12 git bash gitosis githooks git-post-receive
我们使用带有中央仓库的git(使用Gitosis).我已经创建了一个post-receive挂钩,只要将更改推送到中央存储库,就会生成一封发送到dev邮件列表的电子邮件,并从git repo中的文档文件夹生成文档.
因此,在~git /我有一个目录,我们称之为'a',其中包含git repo的克隆.后接收挂钩看起来像:
#!/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 )
Run Code Online (Sandbox Code Playgroud)
电子邮件脚本正在运行,但文档生成却没有.pull_log.log的内容是:
fatal: Not a git repository: '.'
Run Code Online (Sandbox Code Playgroud)
这让我觉得它没有改变到上面脚本第5行的正确目录.我错了吗?我怎样才能让它发挥作用?
编辑:我已按照回复中的建议更新了post-receive hook.该脚本现在是:
#!/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 )
Run Code Online (Sandbox Code Playgroud)
我从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
Run Code Online (Sandbox Code Playgroud)
还有什么帮助吗?
哦,如果我自己运行脚本,它可以工作(我通过说钩子/后接收来运行它)
发现问题,多亏了serverfault - 基本上,环境变量GIT_DIR并GIT_WORK_TREE在钩子运行时设置,这些会对git pull造成不利影响.取消设置变量可以解决问题.
您需要更多诊断,例如,
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"
}
Run Code Online (Sandbox Code Playgroud)
此时,在括号后面的子 shell 中,您可以尝试类似的内容
set -x # show exactly what's executed (writes to stderr)
checkgit ~git/a
cd ~git/a && checkgit . && git pull ...
Run Code Online (Sandbox Code Playgroud)
您还可以考虑重定向子 shell 的整个 stderr,例如,
( ... ) 2>/tmp/mydiagnosis$$.log
Run Code Online (Sandbox Code Playgroud)
(这是一项临时措施,仅当日志中没有机密信息时才可以。)
好吧,塞拉斯,你的附加信息排除了很多尴尬的可能性。我的工作即将结束git,但这里还有一些可以尝试的事情:
~git/a看看能不能git pull手工制作。这应该会失败。~git/a就跑git status。这也应该失败。如果没有,那么git就会给你一个非常糟糕的错误消息。如果这两个步骤都失败了,~git/a那么它就不是您想象的克隆了。重命名它,创建一个新的克隆,然后看看问题是否仍然存在。
如果第一步手动成功,那么就会发生一些奇怪的事情,我会感到困惑。
如果第一步失败但第二步成功,则分支可能存在问题:
也许存储库~git/a设置为错误的分支,而您的存储库需要它没有的分支。尝试git branch -a看看是否会看到一些意想不到的东西。
也许您有分支,但它没有与远程存储库正确关联。此时您必须深入了解~git/a/.git/config,我真的不知道如何解释您应该期望在那里找到什么。那时你将需要一个真正的git 专家;我只在电视上播放过一首。