2013-07-18 19 views
10

私は受信後に単体テストを実行しますが、ユーザがそれを待たせたくはありません。非同期gitフック?

私はgitの-userメーリングリストからの提案を試してみました(「ただ&それ」)が、これは動作していない:https://groups.google.com/forum/#!topic/git-users/CFshrDgYYzE

gitのは、私はちょうどこの中に入れても、終了するにはbashスクリプトを待つように見えますフック/ポスト受信:

exec-unit-tests.sh & 
+0

あなたはその記事で提案されている他の方法を試してみましたか? cronを使用して非同期ジョブをスケジュールしますか?需要に応じて仕事をスケジュールするための「at」のようなものも、 –

+0

を調べてみる価値があるかもしれないが、それは試していない。 – oberhamsi

答えて

17

これは私のために働いた。 &とstdout & stderrのパイプが閉じている必要があります。

long-running-command >&- 2>&- & 

バックグラウンドでコマンドを入れるためには、両方のstdoutstderrを閉じる必要があります。いずれかが開いたままになっていると、プロセスはバックグラウンドにならず、フックスクリプトが終了するまでコミット操作は完了しません。

怠惰な別のアプローチは、単に/dev/nullstdoutstderrをリダイレクトすることです:

long-running-command >/dev/null 2>&1 & 

これは少し少ないきれいですが、おそらく簡単に理解し、覚えておくと、それは同じ効果があります。

+0

が見つかりました:http://git.661346.n2.nabble.com/Background-processes-in-post-receive-hook-td6235357.html – oberhamsi

+0

実際には、 'stdout'と' stderr'の両方を閉じる必要がありますすでにそれをしています)。いずれかを開いたままにすると、プロセスはバックグラウンドにはなりません。個人的には '>/dev/null 2>/dev/null&'を使って同じ効果を得ています。なぜなら、 'man bash'を参照せずに何が行われているのか分かりやすいからです。 – janos

+1

私はあなたの/ dev/nullソリューションがより好きです!それを答えてください – oberhamsi