2013-07-18 10 views
10

Wykonuję testy jednostkowe po odebraniu, ale nie chcę, aby użytkownik czekał na to.Asynchroniczny hak git?

Próbowałem propozycje z listy mailingowej git-user („tylko & IT”), ale to nie działa: https://groups.google.com/forum/#!topic/git-users/CFshrDgYYzE

git zdaje się czekać na skrypcie bash, aby wyjść nawet jeśli po prostu umieścić to w haki/po otrzymaniu:

exec-unit-tests.sh & 
+0

wypróbowałeś inne sposoby sugerowane w tym poście, np. za pomocą crona zaplanować zadanie asynchroniczne? coś jak 'at' do planowania zadań na żądanie (i nie daleko w przyszłości) może być warte zaglądania do –

+0

, które mogą również działać, nie próbowałem tego. – oberhamsi

Odpowiedz

17

To zadziałało dla mnie. & stdout i stderr & rura musi być zamknięty:

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

Aby umieścić polecenia w tle, zarówno stdout I stderr muszą być zamknięte. Jeśli któryś z nich pozostanie otwarty, proces nie będzie działał w tle, a operacja zatwierdzania nie zostanie zakończona, dopóki skrypt przechwytujący nie zostanie zakończony.

Leniwy Alternatywnym podejściem jest po prostu przekierować stdout i stderr do /dev/null:

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

Jest to nieco mniej czyste, ale być może łatwiej zrozumieć i zapamiętać, i ma ten sam efekt.

+0

znaleźć tutaj: http://git.661346.n2.nabble.com/Background-processes-in-post-receive-hook-td6235357.html – oberhamsi

+0

W rzeczywistości zarówno 'stdout', jak i' stderr' muszą być zamknięte (jak twoja odpowiedź już to robi). Jeśli któryś z nich zostanie otwarty, proces nie będzie w tle. Osobiście używam '>/dev/null 2>/dev/null &', aby uzyskać ten sam efekt, ponieważ łatwiej jest się zorientować, co to robi bez szukania w 'man bash'. – janos

+1

Bardziej lubię twoje/dev/null rozwiązanie! proszę, odpowiedz: – oberhamsi