Git的post-receive钩子无法工作

12
我们正在使用带有中央仓库的 Git(使用 Gitosis)。我创建了一个 post-receive 钩子,用于在推送更改到中央仓库时向 dev 邮件列表生成电子邮件,并从 git 仓库中的 documentation 文件夹生成文档。
因此,在 ~git/ 中,我有一个目录,我们称之为“a”,其中包含 git 仓库的克隆。post-receive 钩子如下:
#!/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行它没有切换到正确的目录。我错了吗?我该怎么做才能使它正常工作呢?

编辑: 我已经根据回复中的建议更新了post-receive挂钩。现在脚本如下:

#!/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_DIRGIT_WORK_TREE在钩子运行时被设置,并且这些会对git pull产生不良影响。取消设置这些变量可以解决问题。


2
git pull 更改为 pwd 并查看日志中显示的内容。 - Dennis Williamson
哦!太糟糕了。+1 为找到问题并解决它! - Norman Ramsey
你是怎么找到 pull_log.log 文件的?我不知道日志存储在哪里... - munmunbb
3个回答

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

这只是一种临时措施,只有在日志中没有机密信息时才可以使用。


好的Silas,你提供的额外信息排除了许多尴尬的可能性。我已经接近我的git fu的尽头,但这里还有一些可以尝试的事情:

  1. 进入~git/a,手动运行git pull。这应该会失败。
  2. 进入~git/a并运行git status。这也应该会失败。如果没有失败,则git正在给您提供一个非常糟糕的错误消息。

如果两个步骤都失败,则~git/a不是您想要的克隆。将其重命名,进行新的克隆,并查看问题是否仍然存在。

如果第一步手动成功,则可能出现了奇怪的情况,我感到困惑。

如果第一步失败但第二步成功,则可能存在分支问题:

  • 可能repo ~git/a设置为错误的分支,而您的repo需要一个它没有的分支。尝试git branch -a,看看是否有意外的结果。

  • 也许您有这个分支,但它没有与远程存储库正确关联。此时,您必须深入了解~git/a/.git/config,我不知道如何解释您应该在那里找到什么。此时,您将需要一个真正的git专家;我只是在电视上扮演一个。


你能再看一下吗?我已经添加了你要求的信息。 - Silas Snider
1
@Silas:添加了一些可以尝试的东西。 - Norman Ramsey
我发现了真正的问题--请参见上面更新的描述。 - Silas Snider

0

unset GIT_DIR 是解决您看到的致命错误的方法。

这适用于所有脚本中使用 git 命令的钩子(post-update 是另一个常见的钩子)。git 命令使用环境变量中的 GIT_DIR 而不是 pwd。

请参阅 https://dev59.com/C2855IYBdhLWcg3w_5mm#4100577 以了解更多解释。


0

我最近遇到了类似的问题,我认为这与git设置的环境变量有关,特别是$GIT_DIR变量。如果你设置了它,所有其他仓库上的git命令开始表现奇怪。基本上,我认为在钩子内运行git pull必须在中立的shell环境中调用,该环境没有那些奇怪的变量并导致git混乱,尽管我还没有弄清楚如何做到这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接