12

我们将 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_DIRGIT_WORK_TREE钩子运行时设置,这些对 git pull 产生不利影响。取消设置变量可以解决问题。

4

3 回答 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,您的附加信息排除了许多尴尬的可能性。我的gitfu 快结束了,但这里还有一些可以尝试的方法:

  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 专家;我只在电视上播放一个。

于 2010-02-23T02:00:50.977 回答
0

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

于 2011-10-19T09:31:14.507 回答
0

unset GIT_DIR是一种适用于您看到的致命错误的解决方案。

这适用于钩子中的所有脚本(更新后是另一种常见的),它在其中使用 git 命令。git 命令使用来自 env 的 GIT_DIR 而不是 pwd。

有关进一步说明,请参阅https://stackoverflow.com/a/4100577

于 2014-10-03T15:10:04.420 回答