2015-04-17 8 views
6

git check-attr, belirli bir dosya grubu için bir özniteliğin .gitattributes olarak ayarlanıp ayarlanmadığını kontrol etmeme izin verir. örn:bir git özniteliği kümesine sahip tüm dosyaları listele

# git check-attr myAttr -- org/example/file1 org/example/file2 
org/example/file1: myAttr: set 
org/example/file2: myAttr: unspecified 

, myAttr set sahip tüm joker maçları dahil olmak üzere tüm dosyaları listelemek için kolay bir yol var mı?

cevap

3

Sen veri havuzundaki tüm dosyaları bu gibi git ls-files kullanarak bağımsız değişken olarak liste ayarlayabilirsiniz:

git check-attr myAttr `git ls-files` 

deponuzu çok fazla dosya varsa öldürürsün aşağıdaki hata:

-bash: /usr/bin/git: Argument list too long

Eğer xargs ile üstesinden gelebilir ki:

git ls-files | xargs git check-attr myAttr 

Son olarak, çıkış daha okunabilir hale getirmek için, argüman belirtmedi nerede muhtemelen olanları süzmek isteyeceksiniz çok fazla dosya varsa: grep ile

git ls-files | xargs git check-attr myAttr | grep -v 'unspecified$' 

, sen daha filtreleri geçerli olabilir Bu çıktı sadece istediğiniz dosyaları eşleştirmek için. Eğer dosyaların sadece listesini almak ve dosya adları veya \n veya : ihtiva özellikler için esnek olduğu için NULL karakteri kullanmak isterseniz

+3

Bu çözüm, küçük depolar için iyi ve yeterince hızlı çalışır. Ama bence daha büyük projeler için 'git check-attr 'özellik kümesine sahip tüm dosyaları listelemek için geliştirilmelidir. – StackUnderflow

1

, yapabileceğiniz:

niteliği "sahip dosyanın listesi için = birliği "birleştirme: With

git ls-files -z | git check-attr --stdin -z merge | sed -z -n -f script.sed 

script.sed:

   # read filename 
x   # save filename in temporary space 
n   # read attribute name and discard it 
n   # read attribute name 
s/^union$// # check if the value of the attribute match 
t print  # in that case goto print 
b   # otherwise goto the end 
:print 
x   # restore filename from temporary space 
p   # print filename 
      # start again 

inlined sed komut dosyası ile aynı şey (diğer bir deyişle) Yorum yok sayarak ve noktalı virgül ile yeni satır yerine yerine -f ait -e kullanarak:

git ls-tree -z | git check-attr --stdin -z merge | sed -zne 'x;n;n;s/^union$//;t print;b;:print;x;p' 

PS: Sonuç NUL karakterini kullanarak dosya ayıran bir insan okunabilir şekilde bunları yazdırmak için | xargs --null printf "%s\n" kullanın.

1

diğer mesajlar benim için iyi çalışmıyor, ama orada var:

git ls-files | git check-attr -a --stdin 

"git her dosyayı kontrol edin ve tüm filtreleri yazdırmak" tek astar.

İlgili konular