Desene göre dosyaları tekrar tekrar ekleme


172

Farklı dizinlerde bulunan bir desene (veya glob) göre özyinelemeli olarak dosyaları nasıl eklerim?

Örneğin, bir komut eklemek A/B/C/foo.javave D/E/F/bar.java(ve diğer birkaç java dosyası) istiyorum:

git add '*.java'

Ne yazık ki, bu beklendiği gibi çalışmıyor.


2
Benim için çalışıyor (Mac OS X, Git 1.7.1+). Hangi işletim sistemi ve Git sürümünü kullanıyorsunuz?
Chris Johnsen

3
.javaGeçerli dizininizde bazı (önceden izlenmiş) dosyalarınız varsa, bash ve msys komut satırı “helper” arasında , er, karmaşık joker karakter işlemesi yapıyor olabilirsiniz . Bir çözümden emin değilim. Birden fazla tırnak katmanı deneyebilirsiniz: git add '"*.java"'(tek tırnak glob genişlemesini önlemek için bash tarafından alınır , çift tırnak glob genişlemesini önlemek için msys katmanı tarafından alınır).
Chris Johnsen

1
Not için teşekkürler. Ne yazık ki, bu da işe yaramıyor. Sabit olduğunu söylüyorlar, ama zaten en son sürüme sahibim.
Michel Krämer


1
git add *.javabenim için çalışıyor (GitHub istemcisi ile powershell'de)
ThaDafinser

Yanıtlar:


89

Eklenecek bazı dosyalar henüz izlenmemişse, Sergio Acosta'nın cevabı muhtemelen en iyi bahistir. Kendinizi git'in zaten bildiği dosyalarla sınırlamak istiyorsanız git-ls-files, bir filtreyle birleştirebilirsiniz :

git ls-files [path] | grep '\.java$' | xargs git add

Git, bunu yapmak için herhangi bir süslü mekanizma sağlamaz, çünkü temelde bir kabuk problemidir: belirli bir komuta argüman olarak sunmak için bir dosya listesini nasıl alırsınız?


8
Teşekkürler! Komutunuzu biraz geliştirdim ve şimdi aradığım şeyi yapıyor:git ls-files -co --exclude-standard | grep '\.java$' | xargs git add
Michel Krämer

169

git add [path]/\*.javaAlt dizinlerden java dosyaları eklemek için kullanabilirsiniz ,
örneğin git add ./\*.javageçerli dizin için.

Gönderen git addbelgeler :

Dizin ve alt dizinleri *.txtaltındaki tüm dosyalardan içerik ekler Documentation:

$ git add Documentation/\*.txt

*Bu örnekte yıldız işaretinin kabuktan alıntılandığına dikkat edin ; bu komutun dizinin alt dizinlerindeki dosyaları içermesini sağlar Documentation/.


2
@ MichelKrämer muhtemelen değildi, ama şimdi.
Alberto

7
Bu en iyi çözüm, pencerelerde de çalışıyor.
TheTFo

1
"yıldız işareti * kabuktan alıntılanmıştır". Sanırım "kaçtı" demek istiyorsun. Her durumda, ters eğik kabuk dış kabuğun genişlemesini önler.
gwideman

1
@gwideman Sanırım haklısın, ama o ben değilim. Git-scm.com/docs/git-add#_examples
Sergey Glotov

62

İle zshçalıştırabilirsiniz:

git add "**/*.java"

ve tüm *.javadosyalarınız özyinelemeli olarak eklenecektir.


Bunun için teşekkürler, ama Windows üzerinde msysgit ile çalışıyorum ve sadece bir bash var.
Michel Krämer

1
zshPencereler için bir kabuk olduğunu görüyorum ... bash, imho yerine kullanmak için kendinize bir iyilik yapacaksınız.
Olivier Verdier

1
Zsh'nin Windows bağlantı noktası çok eski bir sürüme dayanır ve her zaman kilitlenir (örneğin girdiğimde ls).
Michel Krämer

Vay canına, mükemmel. Bu özelliği bilmiyordum!
Tomáš Votruba

1
Bunun zsh ile bir ilgisi yok. Bence bu cevap, git'e dokunup joker karakterlerle yolu geçmek ve git'in işlenmesine izin vermek istediğiniz noktayı kaçırıyor. Bu nedenle, hangi kabuğu kullandığınız joker karakter (ler) i genişletmek istemezsiniz. Bunu yapmak için kullandığınız kabuk için uygun bir şekilde alıntı yapmanız gerekir. Ayrıntılar için diğer yanıtlara bakın.
gwideman

55

Biraz konu dışı (özellikle git ile ilgili değil) ama linux / unix kullanıyorsanız bir geçici çözüm olabilir:

find . -name '*.java' | xargs git add

Ve boşluklu yollar bekliyorsanız:

find . -name '*.java' -print0 | xargs -0 git add

Ama bunun tam olarak sorduğun şey olmadığını biliyorum.


6
Bu yaklaşımla ilgili küçük bir sorun - .gitignore'nuzla eşleşen bir dosyayı "bulursanız" git, görmezden gelmenizi söylediğiniz bir dosyayı eklemeye çalıştığınızdan şikayet eder.
Yoyo

2
@yoyo - Sonunda -f ekledim ve bu
Maslow

5
@Maslow, yok sayılması gerekiyorsa bile (.gitignore tabanlı) dosyayı zorla ekleyecektir. Şikayeti almak ve (varsayılan davranış budur) dosyayı eklemek istemem
yoyo

Bu, git joker karakter genişlemesini gerçekleştirmesine izin vermekten nasıl daha iyi?
gwideman

12

Sergey'in cevabı (bana kredi verme) çalışıyor:

You can use git add [path]/\*.java

yakın zamanda git:

$git version
git version 1.7.3.4

Test dosyaları:

$find -name .git -prune -o -type f -print | sort
./dirA/dirA-1/dirA-1-1/file1.txt
./dirA/dirA-1/dirA-1-2/file2.html
./dirA/dirA-1/dirA-1-2/file3.txt
./dirA/dirA-1/file4.txt
./dirB/dirB-1/dirB-1-1/file5.html
./dirB/dirB-1/dirB-1-1/file6.txt
./file7.txt

Git durumu:

$git status -s
?? dirA/
?? dirB/
?? file7.txt

* .Txt ekleniyor:

$git add \*.txt

Güncellenmiş durum:

$git status -s
A  dirA/dirA-1/dirA-1-1/file1.txt
A  dirA/dirA-1/dirA-1-2/file3.txt
A  dirA/dirA-1/file4.txt
A  dirB/dirB-1/dirB-1-1/file6.txt
A  file7.txt
?? dirA/dirA-1/dirA-1-2/file2.html
?? dirB/dirB-1/dirB-1-1/file5.html

8

Dosyalarınızı zaten izliyorsanız ve dosyalarda değişiklik yaptıysanız ve şimdi bunları bir desene göre seçici olarak eklemek istiyorsanız, --modifiedbayrağı kullanabilirsiniz.

git ls-files --modified | grep '<pattern>' | xargs git add

Örneğin, yalnızca bu taahhüde CSS değişikliklerini eklemek istiyorsanız,

git ls-files --modified | grep '\.css$' | xargs git add

Daha man git-ls-filesfazla bayrak için bakın


5

Sadece kullan git add *\*.java. Bu, tüm .java dosyalarını kök dizine ve tüm alt dizinlere ekler.


Mükemmel cevap. Git / add add * / pom.xml tüm dosya isimlerini pom.xml eklemek için.
Philip Rego

4

Henüz belirtilmemiş bir Windows komut satırı çözümü ekleme:

for /f "delims=" %G in ('dir /b/s *.java') do @git add %G

3

Sadece dayalı belirli bir dize vardı dosyaları eklemek istedim git status:

git status | grep string | xargs git add

ve sonra git commit -m 'commit msgdeğiştirilen tüm dosyaları "string" ile dosya başlığında işleme koyabildi


2

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:

  1. İş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 -sBö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).

  1. Ç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.


1

~ / .gitconfig dizinine satır koy

[alias] addt = !sh -c 'git ls-files | grep \"\\.$1*\" | xargs git add' -

Tüm değiştirilmiş java dosyasını eklemek istiyorsanız şunları yapabilirsiniz: git addt java

Samely, tüm değiştirilmiş python dosyasını eklemek istiyorsanız şunları yapabilirsiniz: git addt py

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.