Belirtildiği gibi " Git: Nasıl yinelemeli bir topak kalıbıyla eşleşen bir dizin alt ağacının tüm dosyaları eklerim? ", Düzgün kaçmak ya da (gibi globbing sizin pathspec alıntı eğer '*.java'
, o zaman evet, git add)'*.java'
Git 2.13 (2. Çeyrek 2017) etkileşimli ekleme için olanı geliştiriyor:
Bakınız Jeff King ( ) tarafından 7288e12 (14 Mar 2017) taahhüdü . (Göre Birleştirilmiş - Junio Cı Hamano - içinde 153e0d7 tamamlama 2017 17 Mar)peff
gitster
add --interactive
: ile pathspecs genişletme ls-files
Değiştirilen dosyaların listesini almak istediğimizde, önce kullanıcı tarafından sağlanan yol yollarını " ls-files
" ile genişletiriz ve sonra ortaya çıkan yol listesini " diff-index
" ve " diff-files
" değişkenleri olarak besleriz .
Pathspec'iniz çok sayıda yola genişlerse, iki sorundan biriyle karşılaşabilirsiniz:
İşletim sistemi, argüman listesinin boyutundan şikayet edebilir ve çalışmayı reddedebilir. Örneğin:
$ (ulimit -s 128 && git add -p drivers)
Can't exec "git": Argument list too long at .../git-add--interactive line 177.
Died at .../git-add--interactive line 177.
Bu linux.git
, "drivers" dizininde yaklaşık 20K dosyaya sahip olan depodadır (bu durumda hiçbiri değiştirilmemiştir). ulimit -s
Böyle devasa bir yol kümesi için bile sorunu Linux'ta göstermek için " " hilesi gereklidir.
Diğer işletim sistemleri çok daha küçük sınırlara sahiptir (örneğin, OS X'te yalnızca 5K dosyalarıyla gerçek dünyadaki bir durum görülmüştür).
Çalıştığında bile, gerçekten yavaş. Pathspec kodu çok sayıda yol için optimize edilmemiştir. Ulimitsiz aynı durum:
$ time git add -p drivers
No changes.
real 0m16.559s
user 0m53.140s
sys 0m0.220s
Bunu " ls-files
" tamamen atlayarak ve orijinal pathspec'leri diff komutlarına besleyerek bunu geliştirebiliriz.
Tarihsel olarak " diff-index
" tarafından desteklenen pathspec dili zayıftı, ama artık durum böyle değil.