Git
Chapters ▾ 2nd Edition

8.3 Прилагођавање програма Гит - Гит куке

Гит куке

Као и многи други системи за контролу верзије, програм Гит има начина да позове произвољно написане скрипте када се догоде одређене важне акције. Постоје две групе ових кука: оне на клијентској и оне на серверској страни. Куке на клијентској страни се окидају операцијама као што је комитовање и спајање, а куке на на серверској страни се покрећу при мрежним операцијама као што је прихватање гурнутих комитова. Ове куке можете да користите за разноразне намене.

Инсталација куке

Куке се чувају у hooks поддиректоријуму Гит директоријума. У већини пројеката, то је .git/hooks. Када командом git init иницијализујете нови репозиторијум, програм Гит попуњава директоријум hooks гомилом скрипти које служе као примери, од којих су многе саме по себи корисне; али такође и документују улазне вредности сваке скрипте. Сви примери су написано као скрипте љуске, уз мало Перла убаченог ту и тамо, али било која ваљано именована извршна скрипта ће радити посао — можете их писати у Рубију, Пајтону или у било ком језику који познајете. Ако желите да користите скрипте за куке које су већ испоручене уз репозиторијум, мораћете да им промените име; њихова имена се сва завршавају на .sample.

Да бисте омогућили скрипту за куку, поставите пригодно назван (без било какве екстензије) извршни фајл у hooks поддиректоријуму вашег .git директоријума. Од тог тренутка па надаље, требало би да се позива. Овде ћемо покрити већину главних имена фајлова за куке.

Куке на страни клијента

Постоји много кука за клијентску страну. Овај одељак их дели на куке који се тичу процеса рада комитовања, скрипте које се тичу процеса рада са имејлом, и све остале.

Белешка

Важно је приметити да се куке на клијентској страни не копирају када клонирате репозиторијум. Ако вам је план да овим скриптама заведете поштовање полисе, вероватно ћете то хтети да урадите на серверској страни; погледајте пример у Пример полисе коју спроводи програм Гит.

Куке у вези процеса комитовања

Прве четири куке имају везе са процесом комитовања.

Кука pre-commit се покреће прва, чак и пре него што откуцате комит поруку. Користи се за инспекцију снимка који ће бити комитован, да се провери да ли сте нешто заборавили, да се постара да тестови пролазе, или да се истражи штагод је потребно да истражите у коду. Ако скрипта ове куке на крају свог извршавања врати вредност различиту од нуле, комитовање се прекида, мада то можете да избегнете командом git commit --no-verify. Можете да радите ствари као што су провера стила кода (да покренете lint или нешто слично), провера вишка празног простора на крају редова (подразумевана кука ради управо ово), или да проверите да ли постоји одговарајућа документација за нове методе.

Кука prepare-commit-msg се покреће пре него што се покрене едитор за измену комит поруке, али након што се креира подразумевана порука. Дозвољава вам да измените подразумевану поруку пре него што је види аутор комита. Ова кука узима неколико параметара: путању до фајла који садржи тренутну комит поруку, врсту комита и SHA-1 комита ако се ради о комиту који се мења (amend). У општем случају ова кука није корисна за обичне комитове, али је добра за комитове где се подразумевана порука аутоматски генерише, као што су шаблонске комит поруке, комитови спајања, згњечени комитови, и измењени комитови. Можете их користити у спрези са шаблоном за комит да програмски уметнете информације.

Кука commit-msg узима један параметар који представља путању до привременог фајла који садржи комит поруку коју је написао програмер. Ако ова скрипта врати излазну вредност различиту од нуле, програм Гит обуставља процес комитовања, тако да је можете користити да потврдите стање пројекта или комит поруку пре него што допустите да се комит обави. У последњем одељку овог поглавља, показаћемо како се овај кука користи за проверу да ли се комит порука подудара са прописаним шаблоном.

Након што се обави цео процес комитовања, покреће се post-commit кука. Оне нема никакве параметре, али лако можете добити последњи комит тако што извршите git log -1 HEAD. У општем случају, ова скрипта се користи за обавештење или нешто слично.

Куке у вези процеса рада са имејловима

Можете поставити три куке на клијентској страни за процес рада базиран на имејловима. Све се позивају командом git am, па ако ту команду не користите у свом процесу рада, можете слободно да прескочите овај одељак. Ако закрпе припремљене командом git format-patch добијате путем имејла, онда ће вам неке од ових можда бити корисне.

Прва кука која се покреће је applypatch-msg. Узима један аргумент: име привременог фајла који садржи предложену комит поруку. Програм Гит обуставља примену закрпе ако је враћена вредност из скрипте различита од нуле. Можете је користити да обезбедите исправно форматирање комит поруке, или да нормализујете поруку тако што ће је скрипта изменити у ходу.

Следећа кука која се покреће приликом примењивања закрпа са git am је pre-applypatch. Мало је збуњујуће, али покреће се након што се закрпа примени, али пре него што се направи комит, тако да је можете користити да прегледате снимак пре него што комитујете. Овом скриптом можете покренути тестове или на неки други начин проверити стање радног стабла. Ако нешто недостаје или тестови не пролазе, напуштање скрипте са враћеном вредности различитом од нуле прекида команду git am и закрпа се не комитује.

Последња кука која се покреће током извршавања команде git am је post-applypatch, и она се покреће након што се уради комит. Можете је користити да обавестите групу или аутора закрпе коју сте довукли да сте је успешно применили. Овом скриптом не можете прекинути процес закрпљивања.

Остале куке на клијентској страни

Кука pre-rebase се покреће пре него што ребазирате било шта и може да заустави процес ако врати излазну вредност различиту од нуле. Ову куку можете употребити да не дозволите ребазирање комитова који су већ раније гурнути. pre-rebase кука која је инсталирана као пример уз програм Гит ради управо то, мада претпоставља одређене ствари које се можда не уклапају у ваш процес рада.

Куку post-rewrite покрећу команде које врше замену комитова, као што је git commit --amend и git rebase (мада не и git filter-branch). Њен једини аргумент је команда која је окинула поновно писање комита, а листу тих преписивања преузима са stdin. Многе примене ове куке су исте као и за post-checkout или post-merge куке.

Након успешно извршене команде git checkout, покреће се post-checkout кука; можете је користити да на одговарајући начин припремите радни директоријум тако да одговара окружењу пројекта. Ово може значити пресељење великих бинарних фајлова које не желите да буду део система за контролу верзије, аутоматско генерисање документације, или нешто слично томе.

Кука post-merge се покреће после успешно извршене команде merge. Можете је користити за враћање података које програм Гит не може да прати у радни директоријум, као што су подаци о дозволама. Ова кука исто тако може да потврди присуство фајлова ван контроле програма Гит које можда желите да копирате у радно стабло када се оно измени.

Кука pre-push се покреће уз команду git push, након што се ажурирају удаљене референце али пре него што се било који објекат пренесе. Као параметре прима име и локацију удаљене референце, а листу референци које ће бити ажуриране са stdin. Можете је користити за проверу исправности скупа референци пре него што се догоди само гурање (ако скрипта врати излазну вредност различиту од нуле, гурање се прекида).

Програм Гит повремено ради уклањање ђубрета као део свог нормалног процеса рада тако што изврши git gc --auto. Кука pre-auto-gc се покреће непосредно пре почетка процеса скупљања ђубрета и може се користити да вас обавести да се ово дешава, или да се прекине извршење скупљања ђубрета ако сада није добар тренутак за то.

Куке на страни сервера

Уз куке на страни клијента, као системски администратор можете да користите и неколико важних кука са стране сервера како бисте применили скоро било коју врсту полисе на ваш пројекат. Ове скрипте се покрећу пре и после гурања на сервер. Пре-куке у било које време могу да врате излазну вредност различиту од нуле и тиме одбију гурање, као и да клијенту испишу поруку о грешки; полиса гурања може да буде сложена онолико колико ви то желите.

pre-receive

Прва скрипта која се покреће када се обрађује гурање са клијентске стране је pre-receive. Она са stdin узима листу референци које се гурају; ако заврши извршавање и врати вредност различиту од нуле, ниједна референца се не прихвата. Ову куку можете користити да обезбедите да су све ажуриране референце типа брзо премотавање унапред, или да примените контролу приступа за све референце и фајлове које оне мењају гурањем.

update

Скрипта update је веома слична скрипти pre-receive, сем што се покреће по једном за сваку грану коју клијент који гура покушава да ажурира. Ако клијент који гура покушава да гурне на више грана, pre-receive се покреће само једном, док се update покреће по једном за сваку грану на коју се гура. Уместо да чита са stdin, ова скрипта узима три аргумента: име референце (гране), SHA-1 комита на који је референца показивала пре гурања и SHA-1 комита који клијент покушава да гурне. Ако скрипта update заврши извршавање и врати вредност различиту од нуле, само та референца ће бити одбијена; остале и даље могу да се ажурирају.

post-receive

Кука post-receive се покреће након завршетка комплетног процеса и може да се употреби за ажурирање осталих сервиса или за обавештавање корисника. Узима исте податке са stdin као и pre-receive кука. Примери укључују мејлинг листу, обавештавање сервера за континуирану интеграцију, или ажурирање система за праћење тикета – можете чак и да парсирате комит поруку да откријете да ли неки тикети треба да се отворе, измене или затворе. Ова скрипта не може да обустави процес гурања, али веза са клијентом се не прекида све док се скрипта не изврши у целости, зато будите обазриви ако покушавате да урадите нешто што захтева много времена.

Савет

Ако пишете скрипту/куку коју ће други да читају, боље је да употребљавате дугачке верзије заставица командне линије; након шест месеци ћете нам бити захвални.