Git post-receive hook无效

时间:2010-02-22 21:50:22

标签: git bash gitosis githooks git-post-receive

我们正在使用带有中央仓库的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_DIRGIT_WORK_TREE,这些会对git pull产生负面影响。取消设置变量可以解决问题。

3 个答案:

答案 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,但还有一些事情要尝试:

  1. 进入~git/a并查看是否可以手动制作git pull。这应该失败。
  2. 进入~git/a并运行git status。这也应该失败。如果没有,那么git会给您一个非常糟糕的错误消息。
  3. 如果两个步骤均失败,~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

相关问题