2010-11-13 29 views
6

Kullanıcının eylemlerini bir veritabanında günlüğe kaydeden bir proje olarak birkaç git kanca oluşturmayı planlıyorum. Bu veritabanı tüm aktivitelerini sorgulamak için kullanılabilir. Ben bağlanmaya çalışıyorum eylemlerGit global hook özelleştirme

  • taahhüt vardır
  • çekme
  • itme
  • birleştirme
  • şube Bunun üzerinden kurulabilir dağıtımlardan paketlenmiş almak istiyorum

Paketleme yöneticisi. Git Şu anda devre dışı bazı kancalar (.sample kendi adına eklenir) sahip olmasıdır $PREFIX/share/templates/hooks

bu tür herhangi bir yerleştirerek küresel kanca sağlar. Yeni bir depo oluşturulduğunda, bu kancalar depo Şimdi bir kullanıcı zaten etkindir post-commit ve post-update gibi bu kancalar ve kancalar için paket yüklerse

arasında .git klasöründe kopyalanır. Bu durumda, komut dosyasının üzerine yazılacaktır! Bu,

'un kulağa kötü geldiği anlamına gelir. Tek bir hareket için üç kanca tutmam gerekiyorsa, bunun mümkün olmadığı anlamına gelir. Bu, paket yöneticisinin otomatik yüklemesinin çakışmalara neden olabileceği anlamına gelir.

Şimdi, varsayılan etkin dosyayı üzerine yazmak için kancaları paketlediğimizi düşünün. Bir kullanıcı bu dosyaya bazı eylemler eklemek istiyorsa ve daha sonra paketimi kaldırmaya karar verdiyse, o zaman onun özel komutu da giderdi?

Ben git bu konuda oldukça zeki olduğunu düşündüm ve yanlış :(oldu

bir klasör bu klasörün içinde tüm komut dosyalarını çalıştırmak gerekir post-commit ve post-update ya da her türlü eylem ve budala adlandırılacak ihtiyaç vardır

. Ben Halen mevcut durumla başa çıkmak için bir yol bulmak

+1

Buna bir göz atmanız gerekebilir: [git git izlerini izleme hakkında] (http://stackoverflow.com/questions/3462955/putting-git-hooks-into-repository) - Symlinks'i yüklemek için bir barebone uygulaması yayınladım Uygun kancaları çalıştıran kancalar dizini - aynı görev için birden fazla kancaya kolayca genişletilebilir ve aynı zamanda kendi yerel kancalarının arkasında bırakan kullanıcılar sağlar. – Cascabel

+1

Not: Basit bir "komut dosyası listesi çalıştır", tüm kanca türleri için düzgün çalışmaz çünkü bazıları, stdin üzerinde veri almayı bekler (örneğin, ön alma, sonradan alma, sonradan yeniden yazma); Çoğu naif uygulamalarda, çalıştırılacak ilk betik tüm verileri alacaktır ve geri kalan hiçbir şey (EOF) almaz. Verileri bir kez yakalamak ve her bir komut dosyasına beslemek işe yarayabilir, ancak bu tüm komut dosyaları/durumlar için uygun olmayabilir. –

+0

Jefromi, teşekkürler. Bu iyi bir bağlantı, bir çözüm olabilir, ama yine de sorun, her makinede git yama nasıl kaldırılır, böylece git init kopyaları bir klasöre kancalar bağlar? İyi örnekler var mı? –

cevap

3

Neden "post-commit-hooks" alt dizinini arayacak bir post-hook (örneğin) yazmıyorsunuz ve içinde bulunan tüm betikleri listeleyip çalıştıracaklar.
(başarıyla çalıştırılmamış olan ilk işlem, tüm post-commit kancalarını bozar)

Kullanıcılar, Git repo from a predefined template directory numaralı bilgisayarı başlatıyorsa, tüm özel komut dosyalarını yeni yanıtlarında aldıklarından emin olabilirsiniz.

+0

Eh, ilk senaryo başarısız olursa, işlemin durması gerektiğini düşünüyorum. Biri başarısız olursa diğer tüm senaryoları durdurmanın herhangi bir özel sebebi var mı? –

+0

Evet, kullanıcı şablonları bir ön tanımlama dizininden başlatırsa sorun çıkar. Bu durumda kişisel komut dosyalarım veya paketten yüklenenler buna dahil edilemez. –