複数のコマンドは、Receive後のGITでは機能していません
-
27-09-2019 - |
質問
TRACでGitを使用しています。プッシュ後、私は2つのことをしたいです:
- DIFFを使用して開発チームにメールを送信します
- コミットメッセージに特別なフレーズがある場合(「#1を参照」など)、TRACチケットにコミットメッセージを配置する必要があります。
最初のことは、git-commit-notifierによって解決されます。それは私がポストレシーブフックを作成した後に完全に機能します:
#!/bin/sh /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
私の2番目の要件は、で説明されているように解決できます http://trac-hacks.org/wiki/gitplugin#post-receivehookscripts. 。また、このようなレシーブ後のフックでも完璧に機能します。
#!/bin/sh /var/trac/testgit/commit-updater
どちらの2つのことも、それらが分離されているときに機能します。しかし、私はそれらを組み合わせる必要があります。それで、私はポストレシーブフックを作成しました:
#!/bin/sh /var/trac/testgit/commit-updater /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
とても面白いですが、これは機能していません。コマンドは別々に実行されるときに完全にうまく実行されますが、最初の1つだけがレシーブ後のフックに配置されたときに機能します。
私がそのようなフックを持っている場合:
#!/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
しかし、この2つのコマンドの注文に変更すると、エラーは受けませんが、最初のコマンドのみが機能します。
どんな助けにも感謝します。私はこの問題を長い間解決しようとしていますが、アイデアはありません。
解決
私のコメントが正しいと仮定して、そして 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
他のヒント
ngozeffのソリューションが便利であることがわかりましたが、いくつかの追加を行う必要がありました。最初は、フックの1つが失敗した場合、スクリプトが失敗するはずです。第二に、一部のフックは議論を期待するかもしれません。私の場合、Gitzillaフックはそのようでした。
私にとっては、ギッツィラとギトライトのフックを組み合わせるために以下が働いていました。
#!/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ファイルはシンボリックリンクです。
ファイルの使用に代わるものは次のとおりです。
#!/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/
入力データはそれほど大きくないため、一時的なファイルなしで移動して、データをシェルに保持できます。
#!/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