2013-07-18 12 views
10

Ich führe Komponententests nach dem Empfang durch, möchte aber nicht, dass der Benutzer darauf wartet.Asynchrone Git Haken?

habe ich versucht, die Vorschläge aus der Git-Benutzer-Mailingliste („just & it“), aber das funktioniert nicht: https://groups.google.com/forum/#!topic/git-users/CFshrDgYYzE

git scheint für die Bash-Skript zu warten, selbst zu verlassen, wenn ich habe dies nur in Haken/Post-erhalten:

exec-unit-tests.sh & 
+0

haben Sie die anderen Möglichkeiten versucht, die in diesem Beitrag vorgeschlagen wurden, z. Verwenden Sie Cron, um den asynchronen Job zu planen? etwas wie "at", um Jobs auf Anfrage (und nicht weit in der Zukunft) zu planen, könnte auch einen Blick wert sein in –

+0

das könnte auch funktionieren, ich habe es nicht versucht. – oberhamsi

Antwort

17

Das funktionierte für mich. & und die stdout & Stderr Rohr geschlossen werden muss:

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

Um den Befehl in den Hintergrund zu stellen, sowohl stdout UND stderr müssen geschlossen sein. Wenn einer der beiden geöffnet bleibt, ist der Prozess nicht im Hintergrund und die Festschreibungsoperation wird nicht abgeschlossen, bis das Hook-Skript beendet ist.

Ein fauler alternativer Ansatz ist einfach stdout und stderr zu /dev/null umleiten:

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

Das ist ein bisschen weniger sauber, aber vielleicht leichter zu verstehen und zu erinnern, und es hat die gleiche Wirkung.

+0

finden Sie hier: http://git.661346.n2.nabble.com/Background-processes-in-post-receive-hook-td6235357.html – oberhamsi

+0

Eigentlich müssen beide "stdout" und "stderr" geschlossen sein (wie Ihre Antwort macht es schon). Wenn einer von ihnen offen gelassen wird, ist der Prozess nicht im Hintergrund. Persönlich benutze ich '>/dev/null 2>/dev/null &', um den gleichen Effekt zu erhalten, weil es einfacher ist zu wissen, was das bedeutet, ohne in 'man bash' nachzusehen. – janos

+1

ich mag deine/dev/null Lösung besser! bitte mach es eine Antwort – oberhamsi