Git kanca komut dosyaları depo ile birlikte yönetilebilir mi?


337

Önceden biçimlendirme taahhüt mesajları gibi şeyler için hepimizin paylaşabileceği birkaç temel kanca komut dosyası yapmak istiyoruz. Git'in normalde altında saklanan kanca komut dosyaları vardır <project>/.git/hooks/. Ancak, insanlar bir klon yaptığında ve sürüm kontrollü olmadığında bu komut dosyaları çoğaltılmaz.

Herkesin doğru kanca komut dosyalarını almasına yardımcı olmanın iyi bir yolu var mı? Bu kanca komut dosyalarını depomdaki sürüm denetimli komut dosyalarını gösterebilir miyim?


5
Güzel bir soru. Keşke daha iyi bir cevap olsaydı (mipadi'ye hiçbir şikayeti olmayan, sadece git'in bunu daha otomatik bir şekilde yapmanın bir yolu olsaydı - sadece git klonu için belirlenmiş bir seçenek olsa bile.)
lindes

Katılıyorum, @ lindes! Ama belki de kasıtlı olarak bu kanca paylaşımını kısıtlamak? Sanırım, Windows kullanıcıları için işler dağınık olurdu.
kristianlm

@kristianlm: Zaman zaman dağınık olmasının her türlü nedeni vardır ... ve ayrıca orada olmanın güzel olduğu zamanlar. Keşke kancaları kopyalayacak bir seçenek ya da bir şey olsaydı. Sanırım sadece bir ara git-core kodunu kontrol edip bir yama yapmam gerekecek. :) (Ya başkası yaptığı umudu ... ya da geçici çözüm canlı mipadi cevabı , ya da her neyse.)
Lindes

pre-commitön işleme kancaları için bunu kolaylaştırır. OP'nin herhangi bir keyfi git kancasını yönetmeyle ilgili sorusuna cevap vermez, ancak ön işleme kancaları muhtemelen kod kalitesi amaçları için en sık kullanılanlardır.
ericsoco

Yanıtlar:


144

Teorik olarak, hooksproje dizininizde tüm komut dosyalarıyla bir dizin (ya da tercih ettiğiniz herhangi bir ad) oluşturabilir ve sonra bunları sembolik bağlayabilirsiniz .git/hooks. Tabii ki, repoyu klonlayan her kişi bu sembolik bağları kurmak zorunda kalacaktı (ancak gerçekten süslü olabilirsiniz ve klonlayıcının bunları yarı otomatik olarak ayarlamak için çalıştırabileceği bir dağıtım komut dosyasına sahip olabilirsiniz).

* Nix üzerinde sembolik bağlantısı yapmak için tek yapmanız gereken:

root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"

içindekilerin ln -sfüzerine yazmaya hazırsanız kullanın.git/hooks


38
Bu önemsiz değildi, bu yüzden düzgün symlink nasıl bir bağlantı dahil: stackoverflow.com/questions/4592838/…
David T.

17
git sürüm 2.9 şimdi core.hooksPathkancalar klasörüne bağlamak için .git dışında bir dosya ayarlamak için bir yapılandırma seçeneği vardır .
Aaron Rabinowitz

216

In Git 2.9 , yapılandırma seçeneği core.hooksPathözel bir kanca dizini belirtir.

Kancalarınızı deponuzdaki hooksizlenen bir dizine taşıyın . Ardından, deponun her örneğini izlenen hooksyerine kullanmak üzere yapılandırın $GIT_DIR/hooks:

git config core.hooksPath hooks

Genel olarak, yol mutlak veya kancaların çalıştığı dizine göre olabilir (genellikle çalışma ağacı kökü; bkz. AÇIKLAMA bölümü man githooks).


15
... ve işaret edecek şekilde kancalar dizini ayrı kanca deposu olabilir;)
René Link

10
Peki, git klonu yaptığınızda bu config parametresi otomatik olarak ayarlanmış mı?
Yüzük

4
Kural olarak git config değişkenleri klonladığınız havuz tarafından ayarlanamaz. Bu keyfi kod yürütülmesini önlemek için olduğunu düşünüyorum. git config kodların kancalar, yürütme mesajlarındaki kullanıcı adı ve diğer önemli fonksiyonlarla yürütülmesini kontrol eder.
Max Shenfield

1
Ekipteki bir kişi başka bir şubeye git kontrolü yaparsa ne olur? Onlar her dalda eklemek zorunda ..
jokerster

1
Bu doğru. Öte yandan, kancaları daha yeni taahhütlerde güncellerseniz, klonlanmış depolar bu taahhüdün üzerine inşa edilmiş dallar üzerinde çalışırken bunları otomatik olarak alacaktır. Her iki yol da yukarı ve aşağı yönlüdür.
fabb

15

Projeniz bir JavaScript projesiyse ve npmpaket yöneticisi olarak kullanıyorsanız githooks'u zorlamak için paylaşılan-git- hooks'u kullanabilirsiniz npm install.


5
Şimdi bu saçmalığı kimin müdahaleci eklediğini biliyorum .git/hooks.
gavenkoa

Uyarı - Windows'u desteklemez (git bash'da yönetici olarak çalıştırılmadığı sürece). Basit bir çözüm "preinstall": "git config core.hooksPath hooks" dosyasını package.json içinde bir komut dosyası olarak eklemektir. Yani kancalar git komut dosyalarınızı içeren bir klasördür.
Shane Gannon

8

İçin Nodejs kullanıcıları basit bir çözüm güncelleme etmektir package.json ile

{
  "name": "name",
  "version": "0.0.1",
  ......
  "scripts": {
    "preinstall": "git config core.hooksPath hooks", 

Ön yükleme daha önce çalışır

npm kurulumu

ve git'i . \ hooks (veya seçtiğiniz herhangi bir ad) dizinindeki kancaları aramak üzere yönlendirir . Bu dizin , dosya adı (eksi .sample) ve yapı bakımından . \. Git \ hooks işlevini taklit etmelidir .

Maven ve diğer oluşturma araçlarının önceden yüklenmeye eşdeğer olacağını düşünün .

Ayrıca tüm platformlarda da çalışmalıdır.

Daha fazla bilgiye ihtiyacınız varsa bkz. Https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/


5

Peki git-kanca , bu rota .git/hooksproje dizin altında komut dosyası içine Invoke githooks.

Ayrıca, her yerde kopyalamayı ve sembolik bağlantıyı en aza indirmenizi sağlayan birçok özellik vardır.


5

Modern programlama dillerinin çoğu veya daha ziyade oluşturma araçları, git kancalarını yönetmek için eklentileri destekler. Bu, yapmanız gereken tek şey package.json, pom.xml, vb. Dosyanızı yapılandırmaktır ve ekibinizdeki herhangi birinin derleme dosyasını değiştirmedikçe uymaktan başka seçeneği olmayacaktır. Eklenti sizin için .git dizinine içerik ekleyecektir.

Örnekler:

https://github.com/rudikershaw/git-build-hook

https://github.com/olukyrich/githook-maven-plugin

https://www.npmjs.com/package/git-hooks


Bunu genel bir şekilde gerçekleştirmeye çalıştım, projelerimde kullanıyorum, bu yüzden bu aracı yazdım: pypi.org/project/hooks4git
Lovato

3

Yapım öncesi ve sonrası etkinlikleri olan Visual Studio çözümlerini (ve dolayısıyla projeleri) kullanıyoruz. 'GitHookDeployer' adında ek bir proje ekliyorum. Proje, post build olayında bir dosyayı kendi kendine değiştirir. Bu dosya derleme dizinine kopyalanacak şekilde ayarlanmıştır. Böylece proje her zaman inşa edilir ve asla atlanmaz. Build olayında, tüm git kancalarının yerinde olduğundan emin olur.

Bazı projelerin inşa edecek hiçbir şeyi olmadığı için bunun genel bir çözüm olmadığını unutmayın.


2

Ön işleme gibi ön işleme kanca yönetimi için yönetilen bir çözüm kullanabilirsiniz . Veya Datree.io gibi sunucu tarafı git-kancaları için merkezi bir çözüm . Şu gibi yerleşik politikalara sahiptir:

  1. Sırları tespit edin ve birleştirin .
  2. Uygun Git kullanıcı yapılandırmasını zorunlu kılın .
  3. zorlamak Jira bilet entegrasyonunu kıl - çekme isteği adı / taahhüt mesajında ​​bilet numarasını belirt .

Tüm kancalarınızın yerini almaz, ancak kancaları her geliştiricinin bilgisayarına / repo'suna yapılandırma cehennemi olmadan geliştiricilerinize en belirgin olanlarla yardımcı olabilir.

Feragatname: Datrees kurucularından biriyim


1

Kanca klasörünüzü başka bir git deposu yapabilir ve bir alt modül olarak bağlayabilirsiniz ... Sanırım sadece çok fazla üyeniz ve kancalarınız düzenli olarak değiştiyse buna değer.


1

İdeal olarak, örnek dosyaları takip ederseniz kancalar bash ile yazılır. Ancak mevcut herhangi bir dilde yazabilir ve sadece yürütülebilir bayrağa sahip olduğundan emin olabilirsiniz.

Böylece, hedeflerinize ulaşmak için bir Python veya Go kodu yazabilir ve kancalar klasörünün altına yerleştirebilirsiniz. Çalışacak, ancak depo ile birlikte yönetilmeyecek.

İki seçenek

a) Çoklu Komut Dosyaları

Kancalarınızı yardımınızın içine kodlayabilir ve mükemmel komut dosyanızı çağırmak için kancalara küçük bir kod parçası ekleyebilirsiniz:

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js

b) Tek Senaryo

Daha havalı bir seçenek, hepsini yönetmek için birkaç komut dosyası yerine yalnızca bir komut dosyası eklemektir. Yani, bir kanca / mysuperhook.go oluşturun ve ona istediğiniz her kancayı gösterin.

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)

Parametre, betiğinizin hangi kancaya tetiklendiğini sağlar ve kodunuz içinde ayırt edebilirsiniz. Neden? Bazen, aynı taahhüt ve itme kontrolünü yapmak isteyebilirsiniz.

Ve sonra?

Ardından, aşağıdaki gibi daha fazla işleve sahip olmak isteyebilirsiniz:

  • Taahhüt veya itmeden önce bile her şeyin yolunda olup olmadığını kontrol etmek için kancayı manuel olarak tetikleyin. Senaryonuzu çağırırsanız (seçenek a veya b) hile yapar.
  • CI'deki kancaları tetikleyin, böylece CI için aynı kontrolleri yeniden yazmanıza gerek yoktur, örneğin sadece taahhüt ve itme tetikleyicilerini çağırmak olacaktır. Yukarıdaki ile aynı sorunu çözmelidir.
  • Bir işaretleme doğrulayıcısı veya bir YAML doğrulayıcısı gibi harici araçları arayın. Sistem çağrıları yapabilir ve STDOUT ve STDERR ile başa çıkmanız gerekir.
  • Tüm geliştiricilerin kancaları takmanın basit bir yolu olduğundan emin olun, bu nedenle varsayılan kancaları doğru olanlarla değiştirmek için depoya güzel bir komut dosyasının eklenmesi gerekir
  • Şubeleri geliştirme ve yönetme taahhütlerini engellemek için bir kontrol gibi, her depoya eklemek zorunda kalmadan bazı küresel yardımcılara sahip olun. Global komut dosyalarına sahip başka bir depoya sahip olarak çözebilirsiniz.

Bu daha basit olabilir mi?

Evet, git-hooks'u yönetmenize yardımcı olacak birkaç araç var. Her biri sorunu farklı bir perspektiften ele alacak şekilde uyarlanmıştır ve sizin veya ekibiniz için en iyisini elde etmek için hepsini anlamanız gerekebilir. GitHooks.com , çengel hakkında çok fazla okuma ve bugün mevcut birçok araç sunar.

Bugün itibariyle git kancalarını yönetmek için farklı stratejilerle listelenen 21 proje var. Bazıları sadece tek bir kanca için, bazıları belirli bir dil için vb.

Benim tarafımdan yazılmış ve ücretsiz olarak bir açık kaynak projesi olarak sunulan bu araçlardan birine hooks4git denir . Python'da yazılmıştır (çünkü beğendim), ancak fikir, yukarıda listelenen tüm öğeleri, deponuzun içinde yaşayan ve aramak istediğiniz herhangi bir komut dosyasını çağırabilen .hooks4git.ini adlı tek bir yapılandırma dosyasında ele almaktır. .

Git kancalarını kullanmak kesinlikle harika, ama teklif edilme şekli genellikle insanları ondan uzaklaştırıyor.


Bir süre önce çok daha kısa bir versiyon yayınladım ve moderatörler ile anlaşmaya varıldığı gibi, bunun içinde açıklama ve diğer geliştiricilere yardımcı olabileceğini düşündüğüm kendime yazdığım bir araca kısa bir bağlantı getiriyor.
Lovato

1

Sınıf kullanıcıları için

Bu senaryoları buldum gradle projeleri için çok yararlı .

build.gradle

apply from: rootProject.file('gradle/install-git-hooks.gradle')

gradle / install-git-hooks.gradle

tasks.create(name: 'gitExecutableHooks') {
    doLast {
        Runtime.getRuntime().exec("chmod -R +x .git/hooks/");
    }
}
task installGitHooks(type: Copy) {
    from new File(rootProject.rootDir, 'pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}
gitExecutableHooks.dependsOn installGitHooks
clean.dependsOn gitExecutableHooks

ön taahhüt

.... your pre commit scripts goes here
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.