我们正在使用带有中央仓库的git(使用Gitosis)。我已经创建了一个post-receive挂钩,只要将更改推送到中央存储库,就会生成一封发送到dev邮件列表的电子邮件,并从git仓库中的文档文件夹生成文档。
因此,在~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 )
电子邮件脚本正在运行,但文档生成却没有。 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
还有其他帮助?
哦,如果我自己运行脚本,它可以工作(我通过说钩子/后接收来运行它)
发现问题,感谢serverfault - 基本上,当钩子运行时设置环境变量GIT_DIR
和GIT_WORK_TREE
,这些会对git pull产生负面影响。取消设置变量可以解决问题。
答案 0 :(得分:3)
您需要更多诊断,例如,
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"
}
此时,在括号后面的子shell中,你可以尝试像
这样的东西set -x # show exactly what's executed (writes to stderr)
checkgit ~git/a
cd ~git/a && checkgit . && git pull ...
您也可以考虑重定向子shell的整个stderr,例如,
( ... ) 2>/tmp/mydiagnosis$$.log
(这是一个临时措施,只有在日志中没有机密信息时才可以。)
OK Silas,您的其他信息排除了许多尴尬的可能性。我即将结束git
fu,但还有一些事情要尝试:
~git/a
并查看是否可以手动制作git pull
。这应该失败。~git/a
并运行git status
。这也应该失败。如果没有,那么git
会给您一个非常糟糕的错误消息。如果两个步骤均失败,~git/a
不是您认为的克隆。重命名它,创建一个新的克隆,看看是否可以让问题持续存在。
如果第一步是手工成功,那么一些奇怪的事情正在发生,我感到很困惑。
如果第一步失败但第二步成功,则可能是分支有问题:
也许repo ~git/a
设置为错误的分支,而你的repo需要一个它没有的分支。试试git branch -a
,看看是否有意外的事情发生。
也许您有分支,但它与远程存储库没有正确关联。此时你必须潜入~git/a/.git/config
,我真的不知道如何解释你应该在那里找到什么。那时你需要一个真正的 git专家;我只是在电视上播放一个。
答案 1 :(得分:0)
我最近遇到了类似的问题,我认为它与git设置的环境变量有关,特别是$ GIT_DIR变量。如果你有这个设置,其他repos上的所有git命令都会开始变得非常奇怪。基本上我认为在钩子里运行你的git pull必须在没有那些奇怪变量的中性shell环境中调用并导致git混乱,尽管我还没想出如何做到这一点。
答案 2 :(得分:0)
unset GIT_DIR
是一种解决方案,适用于您所看到的致命错误。
这适用于挂钩中的所有脚本(更新后是另一个常见脚本),它在其中使用git命令。 git命令使用env中的GIT_DIR而不是pwd。
有关详细说明,请参阅https://stackoverflow.com/a/4100577。