Git
Chapters ▾ 2nd Edition

8.3 Prilagođavanje Gita - Git hukovi

Git hukovi

Kao i mnogi drugi sistemi za kontrolu verzije, Git može da pozove proizvoljno napisane skripte kada se dogode određene važne akcije. Postoje dve grupe ovih hukova: na klijentskoj ian serverskoj strani. Hukovi na klijentskoj strani se okidaju operacijama kao što je komitovanje i spajanja, a na serverskoj strani — mrežnim operacijama kao što je prihvatanje gurnutih komitova. Možete da koristite ove hukove za razne namene.

Instalacija huka

Hukovi se čuvaju u poddirektorijumu hooks u Git repozitorijumu. U većini projekata, to je .git/hooks. Kada inicijalizujete novi repozitorijum pomoću git init, Git popunjava direktorijum hooks gomilom skripti koje služe kao primeri, od kojih su mnoge same po sebi korisne; ali takođe i dokumentuju ulazne vrednosti svake skripte. Svi prmieri su napisano kao šel-skripte, uz malo Perla ubačenog tu i tamo, ali bilo koja valjano imenovana izvršna skripta će raditi — možete ih pisati u Rubiju, Pajtonu ili u čemu god. Ako želite da koristite huk-skripte koje su već isporučene uz repozitorijum, moraćete da im promenite ime; njihova imena se sva završavaju sa .sample.

Da biste omogućili huk-skripte, postavite datoteku u poddirektorijimu hooks vašeg Git repozitorijuma sa ispravnim imenom i učinite je izvršnom. Od sada pa nadalje, biće pozvana. Ovde ćemo pokriti većinu velikih imena datoteka za hukove.

Hukovi na strani klijenta

Ima mnogo hukova za klijentsku stranu. Ovaj odeljak ih deli na hukove koji se tiču toka rada komitovanja, skripte koje se tiču toka rada sa mejlom, i sve ostalo.

Note

Bitno je da zapamtite da se hukovi na klijentskoj strani ne kopiraju kada klonirate repozitorijum. Ako vam je plan da ovim skriptama isforsirate polisu, verovatno ćete želeti da to uradite na serverskoj strani; pogledajte primer u Primer polise sprovedene od strane Gita.

Hukovi koji se tiču toka rada komitovanja

Prva četiri huka imaju veze sa procesom komitovanja.

Huk pre-commit se pokreće prvi, pre nego što ukucate komit poruku. Koristi se za inspekciju snimka koji će biti komitovan, da proveri da li ste nešto zaboravili, da se postara da testovi prolaze, ili da istraži štagod poželite da istražite u kodu. Ako skripta vrati vrednost različitu od nule iz huka, komit se prekida, mada se ovo može zaobići komandom git commit --no-verify. Možete da radite stvari kao što su provera stila koda (pokrenite lint ili nešto slično), provera pratećih znakova beline (podrazumevani huk radi upravo ovo), ili da proverite da li postoji dokumentacija za nove metode.

Huk prepare-commit-msg se pokreće pre nego što se otvori editor za izmenu komit poruke, ali nakon što se kreira podrazumevana poruka. Dozvoljava vam da promenite podrazumevanu poruku pre nego što je vidi autor komita. Ovaj huk uzima nekoliko parametara: putanju do datoteke koja drži trenutnu komit poruku, vrstu komita i SHA-1 komita ako se radi o komitu koji unosi ispravke (amend). Ovaj huk u opštem slučaju nije koristan za normalne komitove; umesto toga, dobar je za komitove gde se podrazumevana poruka automatski generiše, kao što su šablonske komit poruke, komitovi spoja, zgnječeni komitovi, i komitovi koji unose ispravke. Možete ih koristiti u sprezi sa šablonom za komit da programski dodate informacije.

Huk commit-msg uzima jedan parametar, koji je opet putanja do provremene datoteke koja sadrži komit poruku koju je napisao developer. Ako skripta kao izlaz da vrednost različitu od nule, Git obustavlja proces komitovanja, tako da možete da ga koristite da potvrdite stanje projekta ili komit poruke pre nego što dopustite da se komit obavi. U poslednjem odeljku ovog poglavlja, pokazaćemo kako se ovaj huk koristi da bi se proverilo da li komit poruka sadrži informacije koje zahteva šablon.

Nakon što se obavi ceo proces komitovanja, pokreće se huk post-commit. One nema nikakve parametre, ali se poslednji komit lako može dobiti pokretanjem git log -1 HEAD. Generalno, ova skripta se koristi za neku vrstu obaveštenja.

Hukovi koji se tiču toka rada sa mejlovima

Možete podesite tri huka na strani klijenta za tok rada baziarn na mejlovima. Svi se pozivaju komandom git am, pa ako ne koristite tu komandu u svom toku rada, možete slobodno da zaobiđete ovaj odeljak. Ako preuzimate zakrpe pripremljene sa komandom git format-patch preko mejla, onda će vam neke od ovih možda biti korisne.

Prvi huk koji se pokreće je applypatch-msg. Uzima jedan argument: ime privremene datoteke koja sadrži predloženu komit poruku. Git obustavlja kreiranje zakrpe ako skripta kao izlaz da vrednost različitu od nule. Možete da koristite ovu metodu da biste bili sigurni da je komit poruka formatirana kako valja, ili da normalizujete poruku tako što će je skripta izmeniti.

Sledeći huk koji se pokreće prilikom primenjivanja zakrpa pomoću git am je pre-applypatch. Malo je zbunjujuće, ali pokreće se nakon što se zakrpa primeni, a pre nego što se napravi komit, tako da ga možete koristiti da pregledate snimak pre nego što komitujete. Možete pokrenuti testove ili na neki drugi način proveriti stanje projekta pomoću ove skripte. Ako nešto nedostaje ili testovi ne prolaze, kada izlaz nije nula, skripta git am će biti obustavljena a zakrpa neće biti komitovana.

Poslednji huk koji se pokreće tokom izvršenja anredbe git am je post-applypatch, koji se pokreće nakon što je načinjen komit. Možete da ga koristite da biste obavestili grupu ili autora zakrpe koju te dovukli da ste primenili zakrpu. Ovom skriptom ne možete prekinuti proces zakrpljivanja.

OStali hukovi na klijentskoj strani

Huk pre-rebase se pokreće pre nego što rebazirate bilo šta i može da zaustavi proces ako se na izlazu nađe vrednost različita od nule. Primer primene ovog huka jeste da ne dozvolite rebaziranje komitova koji su već gurnuti. Primer huka pre-rebase koji je instaliran uz Git radi upravo to, mada pretpostavlja određene stvari koje se možda ne uklapaju u vaš tok rada.

Huk post-rewrite se pokreće komandama koje vrše zamenu komitova, kao što je git commit --amend i git rebase (ali ne i git filter-branch). Jedini argument je komanda koja je okinula pisanje preko komita, ali se dobija lista prepiski na stdin-u. Ovaj huk se na mnoge načine može upotrebiti isto kao i post-checkout ili post-merge.

Nakon uspešno izvršene naredbe git checkout, pokreće se huk post-checkout; možete ga koristiti da pripremite radni direktorijum za okruženje projekta. Ovo može značiti dovođenje velikih binarnih fajlova koje ne želite da sprovodite kroz sistem za kontrolu verzije, automatsko generisanje dokumentacije, ili nešto slično.

Huk post-merge se pokreće posle uspešno izvršene komande merge. Možete ga koristiti radi povratka podataka koje Git ne prati u radni direktorijum, kao što su podaci o permisijama. Ovaj huk isto tako može da validira prisutnost datoteka koji su eksterni Gitovoj kontroli koje možda želite da kopirate kada se radnos tablo promeni.

Huk pre-push se pokreće uz komandu git push, nakon što se ažuriraju udaljene reference ali pre nego što se bilo koji objekat prenese. Prima ime i lokaciju udaljene reference kao parametar, a listu referenci koje će biti ažurirane kroz stdin. Koristi se za validaciju skupa referenci koje će biti ažurirane pre nego što se dogodi samo guranje (ako skripta na izlazu da vrednost različitu od nule, guranje će biti prekinuto).

Git povremeno radi uslugu đubretara kao deo svog normalanog toka rada, pokretanjem git gc --auto. Huk pre-auto-gc pokreće se baš pre nego što se pokupi đubre, i može da se koristi da bi vas obavestilo da se ovo dešava, ili da se prekine izvršenje pokupljanja đubreta ako sada nije dobar trenutak.

Hukovi na strani servera

Pored hukova na strani klijenta, možete da koristite nekoliko važnih hukova sa strane servera kao sistemski administrator kako biste podstakli skoro bilo koju polisu na projektu. Ove skripte se pokreću pre i posle guranja na server. Pre-hukovi mogu da na izlazu daju vrednosti različitu od nule i time odbiju guranje, kao i da odštampaju poruku klijentu; polisa guranja može da bude složena onoliko koliko vi to želite.

pre-receive

Prva skripta koja se pokreće kada se obrađuje guranje od strane klijenta je pre-receive. Uzima listu referenci koje se guraju sa stdin-a; ako je izlaz vrednost različita od nule, nijedan neće biti prihvaćen. Možete da koristite ovaj huk da biste se, na primer, osigurali da neka od ažuriranih referenci nije motanej unapred, ili da primenite kontrolu pristupa za sve reference i datoteke koje se modifikuju guranem.

update

Skripta update je veoma slična skripti pre-receive, sem što se pokreće jednom za svaku granu koju klijent koji gura pokušava da ažurira. Ako klijent koji gura pokušava da gurne na više grana, pre-receive se pokreće samo jednom, ali se update pokreće jednom po grani na koju se gura. Umesto da čita iz stdin-a, ovaj skripta uzima tri argumenta: ime reference (grane), SHA-1 komita na koji je referenca pokazivala pre guranja i SHA-1 komita koji klijent pokušava da gurne. Ako skripta update na izlazu da vrednost različitu od nule, samo ta referenca će biti odbijena; ostale se i dalje mogu ažurirati.

post-receive

Huk post-receive se pokreće nakon što se obavi ceo proces i može da se koristi da se ostali servisi ažuriraju ili da se obaveste korisnici. Uzima iste podatke sa stdin-a kao i huk pre-receive. Primeri uključuju mejling listu, obaveštavanje servera za kontinuiranu integraciju, iil ažuriranje sistema za praženje tiketa — možete čak i da parsujete komit poruku da biste videli da li neki tiketi treba da se otvore, izmene ili zatvore. Ova skripta ne može da obustavi proces guranja, ali klijent neće biti diskonektovan sve dok se skripta ne izvrši u celosti, zato budite obazrivi ako pokušava te da uradite nešto što zahteva mnogo vremena.