Git
Chapters ▾ 2nd Edition

8.3 Git’i Fərdiləşdirmək - Git Hook’ları

Git Hook’ları

Bir çox digər Versiya İdarəetmə Sistemləri kimi, Git də müəyyən vacib tədbirlər baş verdikdə xüsusi skriptləri söndürmək üçün bir yola malikdir. Bu hook-ların iki qrupu var: müştəri tərəfi və server tərəfi. Müştəri tərəfindəki hook-lar committing və birləşmə kimi əməliyyatlarla başlayır, server tərəfindəki hook-lar, push edilmiş commit-lərin alınması kimi şəbəkə əməliyyatlarında işləyir. Bu hook-lardan hər cür səbəbə görə istifadə edə bilərsiniz.

Hook’un Qurulması

Hook-lar hamısı Git qovluğunun hooks subdirectory-da saxlanılır. Əksər layihələrdə bu .git/hooks-dur. git init ilə yeni bir depo qurduğunuzda, Git, hook-lar qovluğunu bir çox nümunə skript ilə doldurur, bir çoxu bunlar üçün yararlıdır; eyni zamanda hər bir skriptin giriş dəyərlərini sənədləşdirirlər. Bütün nümunələr bir hissəsi Perl-in atıldığı shell skriptləri kimi yazılır, lakin düzgün adlandırılan hər hansı bir icra olunan skript yaxşı işləyəcək - onları Ruby və ya Python-da və ya tanış olduğunuz hər hansı bir dildə yaza bilərsiniz. Birləşdirilmiş hook skriptlərindən istifadə etmək istəyirsinizsə, adını dəyişdirməlisiniz; fayl adlarının hamısı .sample ilə bitir.

Bir hook skriptini işə salmaq üçün, müvafiq olaraq adlandırılan (heç bir extension olmadan) və icra oluna bilən .git qovluğunuzun hooks subdirectory-ə bir fayl qoyun. O nöqtədən irəli çağırılmalıdır. Burada əsas hook fayl adlarının əksəriyyətini əhatə edəcəyik.

Müştəri Tərəfindəki Hook’lar

Bir çox müştəri-tərəfi hook var. Bu bölmə onları committing-workflow hook-larına, email-workflow skriptlərinə və hər şeyə bölür.

Note

Müştəri tərəfindəki hook-ların bir depo klonlandığında deyil kopyalandığını qeyd etmək vacibdir. Bu skriptlərlə niyyətiniz bir policy-ni tətbiq etməkdirsə, bunu server tərəfində etmək istərdiniz; Git-Enforced Siyasət Nümunəsi-də nümunəyə baxın.

Committing-Workflow Hook’ları

İlk dörd hook, işləmə prosesi ilə əlaqəlidir.

pre-commit hook-nu bir commit mesajı yazmadan əvvəl işə salın. Tətbiq ediləcək snapshot-u yoxlamaq, bir şeyi unutduğunuzu yoxlamaq, testlərin işlədiyinə əmin olmaq və ya kodda yoxlamaq üçün lazım olan hər şeyi araşdırmaq üçün istifadə olunur. Bu hook-dan non-zero-dan çıxmaq, commit-i ləğv edir, baxmayaraq ki, git commit --no-verify ilə atlaya bilərsiniz. Kod tərzini yoxlamaq (lint və ya buna bənzər bir şey işlətmək), whitespace boşluğunu yoxlamaq (standart hook məhz bunu edir) və ya yeni metodlarla uyğun sənədlərin olmasını yoxlamaq kimi işləri edə bilərsiniz.

Commit mesaj redaktoru işə düşməmişdən əvvəl, lakin default mesajı yaradıldıqdan əvvəl prepare-commit-msg hook-unu işə salın. Commit müəllifi görməmişdən əvvəl standart mesajı düzəltməyə imkan verir. Bu hook bir neçə parametr götürür: indiyə qədər commit mesajını tutan faylın yolu, commit-in növü və bu düzəliş edilmiş bir commit-dirsə, SHA-1 commit-i.

Bu hook ümumiyyətlə normal commit-lər üçün faydalı deyildir; daha doğrusu, şablon mesajlar, birləşmə commit-ləri, düzəliş edilmiş commit-lər kimi standart mesajın avtomatik olaraq yaradıldığı commit-lər üçün yaxşıdır. Proqramı daxil etmək üçün bir commit şablonu ilə birlikdə istifadə edə bilərsiniz.

commit-msg hook-u bir parametr alır, bu da yenə developerlər tərəfindən yazılan commit mesajını alan keçici bir faylın yoludur. Bu skript sıfırdan kənar olarsa, Git commit götürmə prosesini ləğv edir, beləliklə proyekt vəziyyətinizi təsdiqləmək və ya commit-in yerinə yetirilməsinə icazə vermədən əvvəl mesaj göndərmək üçün istifadə edə bilərsiniz. Bu fəslin son hissəsində, commit mesajınızın tələb olunan bir nümunəyə uyğun olub olmadığını yoxlamaq üçün bu hook-dan istifadə edəcəyik.

Bütün commit prosesi başa çatdıqdan sonra post-commit hook-u işləyir. Heç bir parametr tələb etmir, ancaq git log -1 HEAD-u işə salmaqla sonuncu commit-i asanlıqla əldə edə bilərsiniz. Ümumiyyətlə, bu skript bildiriş və ya oxşar bir şey üçün istifadə olunur.

E-poçt İş Axını Hook’ları

E-poçt əsaslı workflow üçün üç müştəri tərəfində hook qura bilərsiniz. Hamısı git am əmri ilə çağırılır, buna görə workflow əmrinizdə bu əmrdən istifadə etmirsinizsə, növbəti hissəyə etibarlı şəkildə keçə bilərsiniz. Əgər git format-patch tərəfindən hazırlanmış e-poçt üzərindən patch-lar alırsınızsa, bunlardan bəziləri sizin üçün faydalı ola bilər.

İşlədilən ilk hook applypatch-msg-dir. Tək bir arqument tələb olunur: təklif edilən commit mesajını ehtiva edən müvəqqəti sənədin adı. Bu skript non-zero-dan çıxsa Git patch-ı ləğv edir. Bunu bir commit mesajının düzgün şəkildə formatlandığından əmin olmaq və ya skriptin yerində düzəldərək mesajı normallaşdırmaq üçün istifadə edə bilərsiniz.

git am vasitəsilə patch-lar tətbiq edilərkən işə salınacaq növbəti hook pre-applypatch-dir. Bu bir az qarışıqdır, patch tətbiq olunduqdan sonra işlənir, lakin bir commit götürülmədən əvvəl, snapshotunu yoxlamaq üçün istifadə edə bilərsiniz.

Bu skriptlə testlər apara və ya işləyən ağacı yoxlaya bilərsiniz. Bir şey əskikdirsə və ya testlər keçmirsə, non-zero-dan çıxmaq patch etmədən git am skriptini ləğv edir.

Bir git am əməliyyatı zamanı işləyən son hook, commit götürüldükdən sonra işləyən post-applypatch-dir. Bunu bir qrupa və ya pull etdiyiniz patch-ın müəllifinə bunu etdiyinizi bildirmək üçün istifadə edə bilərsiniz. Bu skriptlə patching prosesini dayandıra bilməzsiniz.

Başqa Müştəri Hook’ları

pre-rebase hook-u hər hansı bir şeyi təzələmədən əvvəl işləyir və non-zero-dan çıxaraq prosesi dayandıra bilər. Bu hook-dan artıq push edilmiş commit-lərin azaldılmasına icazə verməmək üçün istifadə edə bilərsiniz. Git’in quraşdırdığı pre-rebase hook nümunəsi bunu edir, baxmayaraq ki, workflow uyğun gəlməyəcək bəzi fərziyyələr irəli sürür.

post-rewrite hook-u git commit --amendgit rebase (git filter-branch tərəfindən olmasa da) kimi commit-ləri əvəz edən əmrlər tərəfindən idarə olunur. Tək arqumenti, yenidən yazmağı hansı əmrlə işə salmasıdır və stdin-də yenidən yazılanların siyahısını alır. Bu hook-un post-checkoutpost-merge hook-larla eyni istifadəsi çoxdur.

Uğurlu bir git checkout etdikdən sonra post-checkout hook-u işləyir; iş qovluğunu layihə mühitini düzgün qurmaq üçün istifadə edə bilərsiniz. Bu, mənbədən idarə olunan avtomatik olaraq yaradan sənədləri və ya bu sətirdə bir şey istəmədiyiniz böyük ikili sənədlərdə hərəkət etmək deməkdir.

post-merge hook-u uğurlu merge əmrindən sonra işləyir. Bunu Git-in izləyə bilmədiyi iş ağacındakı icazə məlumatları kimi məlumatları bərpa etmək üçün istifadə edə bilərsiniz. Bu hook eyni şəkildə işləyən ağac dəyişdikdə kopyalamaq istədiyiniz Git nəzarətindən kənar sənədlərin mövcudluğunu təsdiqləyə bilər.

Uzaqdakı istinadlar yeniləndikdən sonra, lakin hər hansı bir obyekt köçürülməmişdən əvvəl, pre-push hook-u git push zamanı işləyir. Remote-un adını və yerini parametr olaraq alır və stdin vasitəsilə yenilənəcək reflərin siyahısını alır. Bir push etmə meydana gəlməzdən əvvəl bir sıra ref yeniləmələrini təsdiqləmək üçün istifadə edə bilərsiniz (non-zero bir çıxış kodu push etməyi ləğv edəcək).

Git, bəzən normal fəaliyyətinin bir hissəsi olaraq garbage collection-u, git gc --auto əmrini işlədərək edir. pre-auto-gc hook garbage collection-dan bir az əvvəl çağırılır və bunun baş verdiyini xəbərdar etmək və ya yaxşı bir vaxt olmadığı təqdirdə collection-u ləğv etmək üçün istifadə edilə bilər.

Server Tərəfindəki Hook’lar

Müştəri tərəfindəki hook-lara əlavə olaraq, layihə üçün hər cür siyasəti tətbiq etmək üçün bir sistem administratoru kimi bir neçə vacib server tərəfli hook-dan istifadə edə bilərsiniz. Pre hook-lar push etməni rədd etmək və müştəriyə bir səhv mesajı yazdırmaq üçün istənilən vaxt non-zero-dan çıxa bilər; istədiyiniz qədər kompleks bir push etmə siyasəti yarada bilərsiniz.

pre-receive

Müştəri tərəfdən bir push etmə işləyərkən işləyən ilk skript pre-receive-dır. Stdin-dən pushed edilən istinadların siyahısını alır; non-zero-dan çıxsa, heç biri qəbul edilmir.

Bu hook-dan istifadə edərək güncəllənmiş istinadların heç birinin sürətli göndərilmədiyinə əmin olmaq və ya push etməklə dəyişdirdikləri bütün istinadlar və sənədlər üçün giriş nəzarəti etmək üçün istifadə edə bilərsiniz.

update

update skripti pre-receive skriptinə çox oxşayır, yalnız push etmə yeniləməyə çalışdığı hər branch üçün bir dəfə işlədilir. Pusher birdən çox branch-a push etməyə çalışırsa, pre-receive yalnız bir dəfə işləyir, yeniləmə push etdikləri hər branch üçün bir dəfə işləyir. Stdin-dən oxumaq əvəzinə bu skript üç arqument götürür: istinadın adı (branch), istinaddan əvvəl göstərilən SHA-1 və istifadəçi push etməyə çalışdığı SHA-1. Yeniləmə skripti non-zero-dan kənar olarsa, yalnız həmin müraciət rədd edilir; digər istinadlar yenilənə bilər.

post-receive

post-receive hook bütün proses başa çatdıqdan sonra işləyir və digər xidmətləri yeniləmək və ya istifadəçiləri xəbərdar etmək üçün istifadə edilə bilər. pre-receive hook-la eyni stdin məlumatlarını alır. Nümunələr siyahının elektron poçtla göndərilməsi, davamlı inteqrasiya serverinə bildiriş verilməsi və ya ticket-tracking sisteminin yenilənməsi daxildir - hətta biletlərin açılmalı, dəyişdirilməli və ya bağlanmalı olub olmadığını görmək üçün commit mesajlarını təhlil edə bilərsiniz. Bu skript push etmə prosesini dayandıra bilməz, lakin müştəri tamamlanana qədər əlaqəsini kəsmir, buna görə uzun müddət ala biləcək bir şey etməyə çalışsanız ehtiyatlı olun.