2010-02-22 133 views
12

我们使用git和中央repo(使用Gitosis)。我创建了一个post-receive钩子,当更改被推送到中央仓库时,生成一个发送到dev邮件列表的电子邮件,并从git仓库中的文档文件夹生成文档。Git post-receive hook不工作

因此,在〜混帐/我有一个目录,我们将称之为“一”包含混帐回购协议的副本。后收到钩的样子:

#!/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 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) 

而且我从混帐推以下的输出:

+ 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拉动不利。取消设置变量可以解决问题。

+2

将'git pull'更改为'pwd'并查看日志中显示的内容。 – 2010-02-23 00:57:28

+0

哦!讨厌。 +1用于追踪问题并杀死它! – 2010-02-25 03:05:36

+0

你是如何找到pull_log.log文件的?我不知道日志存储在哪里... – munmunbb 2015-11-16 23:57:52

回答

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 ... 

的东西,你也可以考虑重新引导整个STDERR的子壳体,例如,

(...) 2>/tmp/mydiagnosis$$.log 

(这是一种临时措施,只有在有一个在日志中没有任何信息保密。)


OK西拉斯,您的额外信息排除了很多尴尬的可能性。我接近我git富结束,但这里有一些更多的东西来尝试:

  1. 走进~git/a,看看是否可以用手使其git pull。这应该会失败。
  2. 钻进~git/a和运行git status。这也应该失败。如果没有,那么git会给你一个非常糟糕的错误信息。

如果两个步骤都失败,~git/a不是您认为的克隆。重新命名它,创建一个新的克隆,并看看是否可以让问题持续下去。

如果第一步手工成功,那么奇怪的事情正在发生,我很困惑。

如果第一步失败,但第二成功,你可能有分支的问题:

  • 也许回购~git/a被设置为错误的分支,你需要回购的分支它没有。尝试git branch -a,看看你是否看到意想不到的事情。

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

+0

你能再看一次吗?我已添加您要求的信息。 – Silas 2010-02-23 15:08:59

+1

@Silas:增加了更多的东西来尝试。 – 2010-02-24 02:44:06

+0

我发现了真正的问题 - 请参阅上面的更新说明。 – Silas 2010-02-24 15:16:14

0

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

0

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

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

请参阅https://stackoverflow.com/a/4100577作进一步说明。