2010-10-21 17 views
16

, ama sadece belli dosyalarda sekmeleri içeren git'e iter dosya belirli bir sınıfa ait (dosya adına göre). Mümkün mü?
Githooks'ta update hook'a biraz baktım ve bunun doğru olduğunu düşünüyorum.önle (örneğin * .cpp, * .h, CMakeLists.txt) Ben bir sekme içeren bir dosyayı içeren herhangi iter reddetme benim uzak depo istiyorum

  1. bir veya birden fazla sekme karakter içeriyor listelenen türleri (*.cpp, *.h, CMakeLists.txt)
  2. bir dosya vardır: eğer

    Yani kısacası, bir itme reddedilmelidir.
+0

Çengelin yazılmasıyla ilgili yardım mı istiyorsunuz, yoksa bir güncelleme çengelinin bu amaç için çalışıp çalışmayacağını mı merak ediyorsunuz? – Cascabel

+0

Her ikisi de aslında :) Bunun kolay bir şekilde yüklenemez ve indirilebilir olmadığından çok şaşırdım, bu yüzden önemsiz olduğunu hissetmiyorum. Böyle bir kancanın nasıl görüneceğine dair bir örnek çok yardımcı olacaktır. –

cevap

15

Ah ah, bu soru çatlaklardan kaymış gibi görünüyor. Umarım hala oradasın Esben!

Güncellenmiş her ref kez çalıştırılan bir update hook, aradığınız

. Argümanlar, ref'in adı, eski nesne adı (SHA1 işlemi) ve yeni nesne adıdır.

Yapmanız gereken tek şey, eski ile yeni arasındaki farkı kontrol etmek ve standartlarınıza uygun olduğundan emin olmak. Elbette bu tamamen basit değil, ama tamamen yönetilebilir. İşte öyle yapardım:

.git/hooks/update aşağıdaki komut dosyasını kaydedin. İstenen tüm olanlar için eski ve yeni, greps arasında farklılık tüm dosyaları listeler

old=$2 
new=$3 

# that's a literal tab, because (ba)sh turns \t into t, not a tab 
# make sure your editor doesn't expand it to spaces 
git diff --name-only $old $new | egrep '(\.(cpp|h)$)|^CMakeLists.txt$' | xargs -d'\n' git diff -U0 $old $new -- | grep -q '^+.* ' && exit 1 

, (umurumuzda değil çünkü bağlam sıfır hatları ile) onlar için diff alır ve greps için bir sekme içeren eklenmiş bir satır (+ ile başlayan). Biri bulursa grep başarılı olursa, &&'un exit 1 çalışmasına izin verir, bu da kopyanın hatadan çıkmasına ve güncellemenin iptal edilmesine neden olur!

Bunun gereksinimlerinizden biraz farklı olduğunu unutmayın - farkın herhangi bir sekme karakteri ekleyip eklemediğini kontrol eder. Bu uzun vadede muhtemelen daha iyidir; Mevcut kodunuzun tamamlandığından emin olduktan sonra, tüm içeriği aramak zorunda olmadığından çok daha hızlı bir şekilde aynı şeydir.

+0

Bu mükemmel. Aslında çözümüme yüklemek için buraya geliyordum ve çok yakınım ... dosya türlerini filtrelemek için kullanıyorum - $ (git ls-files ....). Çözümümün uzmanlarla eşleştiğini görmek harika bir rahatlıktır :) –

+0

Sadece bunu * .cpp, * .h veya CMakeLists.txt içermeyen bir işlemle denedim (yalnızca başka bir adla rastgele bir .txt). Sonra xargs 'git diff -U0 $ old $ new - 'i yürütür ve bu sadece tüm işlemi tamamlar. Xargs komutu şöyle olmalıdır: 'xargs -r -d '\ n' git diff -U0 $ old $ new -' boş girişleri yürütmesini engellemek için. – ancow

3

Bir pre-push hook kurabilirsiniz, ancak bu gerçekten git yayın mekanizmasının ruhu içinde değildir.

Daha doğrusu ile gider: Herhangi bir yanlış içerik

  • veya kolayca dosyanın sağ türleri ile ilişkilendirmek bir filter driver ile taahhüt önlenmesi,

    • bir pre-commit hook ve hangi düzeltmek veya rapor edebilirsiniz herhangi bir uygunsuz içerik.
  • +0

    Bu durumda, OP'nin bir ön itme kancasından daha fazla bir güncelleme kancaya sahip olması daha muhtemel görünüyor; Eğer kötü içeriği kamusal repodan uzak tutmakla ilgili ise, muhtemelen her zaman doğru olan geliştiricilere güvenmek yerine, merkezi repo üzerine bir barikat koymak isteyebilirsiniz. Önceden bağlanmış kancada seninleyim. Yaptığım zaman, yayınlandığım zamandan daha fazla kodun çıkmasıyla ilgili bir sorun olduğunu öğrenmeyi tercih ederim. – Cascabel

    +0

    @Jefromi: kabul etti. Geliştirme yaşam döngüsünde daha önce sorunları tespit etmeyi daha iyi buluyorum;) – VonC

    +0

    Önceden hazırlanmış kancayı zaten yazdım. Ama bu nispeten kolaydı; güncelleme kancası çok daha karmaşık görünüyor. Doğru yönün ne olabileceğine dair bir örnek çok takdir edilecektir. Ve evet, her ikisine de sahip olmak niyetindeyim: Onlara karşı geliştiricilere yardım etmek için ön-taahhüt ve birbirlerine karşı yardım etmek için güncellemek. Devs aranan sekme zaten kontrol/taahhüt üzerine ileri geri dönüştürmek için kullandığı bir betik var. –

    1

    benprew's çalışmalara dayanarak, burada herhangi bir sekme karakterleri ekleme yapılmışsa, bir hata görüntüler önceden senaryo kanca yanı sıra, ilgili hat numarası. Aşağıdakileri .git/hooks/pre-commit'a kaydedin.

    (Not: pre-commit dosya adı.Orada

    #!/bin/sh 
    
    if git rev-parse --verify HEAD 2>/dev/null 
    then 
        git diff-index -p -M --cached HEAD 
    else 
        : 
    fi | 
    perl -e ' 
        my $found_bad = 0; 
        my $filename; 
        my $reported_filename = ""; 
        my $lineno; 
        sub bad_line { 
         my ($why, $line) = @_; 
         if (!$found_bad) { 
          print STDERR "*\n"; 
          print STDERR "* You have some suspicious patch lines:\n"; 
          print STDERR "*\n"; 
          $found_bad = 1; 
         } 
         if ($reported_filename ne $filename) { 
          print STDERR "* In $filename\n"; 
          $reported_filename = $filename; 
         } 
         print STDERR "* $why (line $lineno)\n"; 
         print STDERR "$filename:$lineno:$line\n"; 
        } 
        while (<>) { 
         if (m|^diff --git a/(.*) b/\1$|) { 
          $filename = $1; 
          next; 
         } 
         if (/^@@ -\S+ \+(\d+)/) { 
          $lineno = $1 - 1; 
          next; 
         } 
         if (/^ /) { 
          $lineno++; 
          next; 
         } 
         if (s/^\+//) { 
          $lineno++; 
          chomp; 
          if (/ /) { 
           bad_line("TAB character", $_); 
          } 
         } 
        } 
        exit($found_bad); 
    ' 
    

    Size herhangi dosya adı denetimi yapmaz çünkü ne istedi tam değil) herhangi . uzantısı olabilir, ama umarım ne olursa olsun yardımcı olmamalıdır.