6

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

  1. 使用差异向开发团队发送电子邮件
  2. 如果提交消息中有一些特殊的短语(例如“see #1”),那么我希望将提交消息放在 trac 票中。

第一件事是由 git-commit-notifier 解决的。在我创建了接收后挂钩后,它可以完美运行:

#!/bin/sh

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

我的第二个要求可以按照http://trac-hacks.org/wiki/GitPlugin#post-receivehookscripts中的描述来解决。它也可以完美地与这样的 post-receive 挂钩:

#!/bin/sh

/var/trac/testgit/commit-updater

当它们分开时,这两件事都有效。但我需要将它们结合起来。所以我创建了接收后挂钩:

#!/bin/sh

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

这很有趣,但这不起作用。这些命令在单独运行时运行得很好,但只有第一个在它们被放入 post-receive 钩子时才有效。

如果我有这样的钩子:

#!/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: nil:NilClass (NoMethodError) 的未定义方法`strip'
        来自 /var/lib/gems/1.8/bin/git-commit-notifier:19:in `load'
        来自 /var/lib/gems/1.8/bin/git-commit-notifier:19

但是,如果我更改这 2 个命令的顺序,我不会收到任何错误,但只有第一个命令有效。

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

4

4 回答 4

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
于 2010-08-10T12:28:23.860 回答
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 文件是符号链接。

于 2011-09-11T11:11:26.637 回答
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/

于 2014-01-16T10:10:37.140 回答
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
于 2014-03-19T20:03:51.930 回答