我正在使用带有trac的git。推后我想要做两件事:
第一件事是由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
但是,如果我改变这两个命令的顺序,我没有收到任何错误,但只有第一个命令有效。
我将不胜感激任何帮助。我试图解决这个问题很长一段时间,我没有想法。
答案 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