Git hook - fájlok társítása és futtatása

A git hook-ok a .git/hooks/ könyvtár alatt található állományok. A tartalmuk a git shell által értelmezhető parancsokból áll, és esemény kezelőként szolgálnak. Nem valami fejlett az esemény kezelési modell, viszont attól még működik. Például a pre-commit hook a commit előtt fut le, mint azt a neve is mutatja, és képes megakadályozni a commit lefutását. Ez körülbelül a HTML 10 évvel ezelőtti esemény moddeljének felel meg, ahol szintén a visszatérési értékkel lehetett az eseményt semmissé tenni...

A git hook-ok egyébként nagyon hasznosak tudnak lenni pusztán ettől a funkciótól is, hiszen a deploy kódot lehet hívogatni velük... Például a pre-commit-ban elhelyezhetünk unit test-eket, vagy osztályokból nagyobb fájlok összeállítását, esetleg fájlméret optimalizálást, de akár a commit után is elvégezhetőek ugyanezek, sőt a committál fájlok teszt majd éles szerverre történő másolása, és még sok dolog ugyanígy megoldható velük. Gyakorlatilag egy egész build rendszert lehet erre építeni, ahogy már meg is tették mások a maven és az ant esetében. Ennek a hook-os megoldásnak az előbbiekkel szemben annyi az előnye, hogy nincs feleslegesen túlbonyolítva...

A git hook-ok egy nem túl standard felhasználási módja a parancsfájlként történő futtatás. Nekem erre azért volt szükségem, mert windows alatt szerettem volna unix-os parancsokat használni, és ezek bent vannak a shell-ben. Persze ugyanezt cygwinnel is megoldhattam volna, dehát minek tegyek fel egy új rendszert, amikor már van egy használható?!

Az alap problémám az volt, hogy volt egy pre-commit-om, amit szerettem volna parancsfájlba áttenni. Próbálkoztam bat fájllal, wsh-js fájllal, de egyik sem volt igazán nyerő, mindegyik elbukott, vagy a szóközös fájlnevek, vagy a unix függvények miatt. Végül úgy döntöttem, hogy megpróbálom a git-tel lefuttatni az eredeti kódot valahogyan. Persze először itt is wsh-val próbálkoztam, de nem jött össze a sok egymásba rakott idézőjel miatt megzavarodott az egész.

Végül úgy döntöttem, hogy jobb hagyni a wsh-t, és a windows-os cli-t a lehető legkisebb mértékben érintő kódot írni. Ez gyakorlatilag azt jelenti, hogy meghagyom a hook fájlt, és megpróbálom a tartalmát lefuttatni valahogyan a git shell-ben. Keresgéltem elég sokat, de nem találtam szinte semmit. Ezután megpróbáltam a hook fájlt társítani valamelyik git exe-hez, de ez sem vezetett eredményre. Végül felfedeztem, hogy a git bash-ben akár txt fájlokat is le lehet futtatni pusztán a fájlnév beírásával, és a bennük lévő parancsok ugyanúgy végrehajtásra kerülnek, mint az automatikusan hívott hook-oknál. Ebből kiindulva csináltam egy kis bat fájlt, ami a megadott fájlt a git bash-ben végrehajtja.

if not exist %1 exit
set bash=C:\Program Files (x86)\Git\bin\bash.exe
"%bash%" --login -i -c "exec "%1""

Ezek után a .hook kiterjesztésű fájlokat ehhez társítottam, és így megszületett a git shell parancsfájl. Elég vicces a munkatempóm ennél a kódnál, minden sorra pontosan egy nap jut. Három nap keresgéléssel, és windows script hosttal történő szenvedéssel jutottam el eddig, de azt hiszem megérte... :-)

Nincsenek megjegyzések:

Megjegyzés küldése