多个命令在git post-receive中不起作用

时间:2010-08-10 11:19:21

标签: git shell hook trac git-post-receive

我正在使用带有trac的git。推后我想要做两件事:

  1. 使用diff
  2. 向开发团队发送电子邮件
  3. 如果提交消息中有一些特殊短语(如“参见#1”),那么我希望将提交消息放在trac票证中。
  4. 第一件事是由git-commit-notifier解决的。在我创建了post-receive hook之后它完美地运行了:

    #!/bin/sh
    
    /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
    

    我的第二个要求可以在http://trac-hacks.org/wiki/GitPlugin#post-receivehookscripts处解释。它也适用于这种后接收钩:

    #!/bin/sh
    
    /var/trac/testgit/commit-updater
    

    这两件事在它们分开时都有效。但我需要将它们结合起来。所以我创建了post-receive hook:

    #!/bin/sh
    
    /var/trac/testgit/commit-updater
    /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
    

    这很有趣,但这不起作用。单独运行时,命令运行得非常好,但只有当它们被置于后接收挂钩时才能运行。

    如果我有这样的钩子:

    #!/bin/sh
    
    /var/trac/testgit/commit-updater
    /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
    

    我收到以下错误

    /var/lib/gems/1.8/gems/git-commit-notifier-0.8.0/bin/git-commit-notifier:12: undefined method `strip' for nil:NilClass (NoMethodError)
            from /var/lib/gems/1.8/bin/git-commit-notifier:19:in `load'
            from /var/lib/gems/1.8/bin/git-commit-notifier:19
    

    但是,如果我改变这两个命令的顺序,我没有收到任何错误,但只有第一个命令有效。

    我将不胜感激任何帮助。我试图解决这个问题很长一段时间,我没有想法。

4 个答案:

答案 0 :(得分:5)

假设我的评论是正确的,并且commit-updater正在吃掉所有stdin,这应该可以解决问题:

#!/bin/sh

FILE=`mktemp`
cat - > $FILE
cat $FILE | /var/trac/testgit/commit-updater
cat $FILE | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
rm $FILE

答案 1 :(得分:1)

我发现ngoozeff的解决方案很有用,但我不得不做一些补充。首先,如果其中一个挂钩失败,脚本应该失败。第二,一些钩子可能会引发争论。在我的情况下,gitzilla钩就是这样。

对我来说,下面的工作是结合gitzilla和gitolite钩子:

#!/bin/sh

FILE=`mktemp`
cat - > $FILE
cat $FILE | $GIT_DIR/hooks/update.gitzilla $* || exit 1 
cat $FILE | $GIT_DIR/hooks/update.gitolite $* || exit 1
rm $FILE

请注意$ *和exit语句。您还可以使用$ GIT_DIR变量。 update.gitzilla和update.gitolite文件是符号链接。

答案 2 :(得分:1)

使用文件的替代方法是:

#!/bin/sh

while read oldrev newrev refname
do
   echo $oldrev $newrev $refname | /var/trac/testgit/commit-updater
   echo $oldrev $newrev $refname | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
done

来源:http://mmm.beachtemple.com/blog/2009/04/06/git-post-receive-hook/

答案 3 :(得分:0)

由于输入数据不是那么大,你可以不用临时文件并将数据保存在shell中:

#!/bin/sh

refs=$(cat)
/var/trac/testgit/commit-updater <<END
$refs
END
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml <<END
$refs
END