Belirli bir dosya türü dışında, belirli bir klasör altındaki tüm dosyaları yinelemeli olarak doğru şekilde yok sayın


89

Benzer sorular ( 1 , 2 ve 3 ) gördüm, ancak onlardan uygun bir çözüm alamıyorum.

Belirli bir dosya türü dışında, belirli bir klasör altındaki tüm dosyaları yok saymam gerekiyor. Klasör, kök yol için bir alt dizindir. Klasöre bir isim vereyim Resources. İşleri karmaşıklaştırmak istemediğim için, Resourcesnerede olursa olsun adlandırılmış tüm klasörler altındaki dosyaları yoksaymama izin verin .

Bu en yaygın çözümdür (tüm yinelenen sorularda)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

Bu çözümle ilgili sorun, yeni eklenen dosyaları izlemeyi durdurmasıdır (çünkü *tüm dosyaları yok sayar). Her bir dosya türünü hariç tutmak istemiyorum. Herhangi bir yeni dosya eklendiğinde git statusonu gösteren normal davranış istiyorum .

Nihayet burada bir çözüm buldum . Çözüm, klasöre başka bir .gitignoredosya eklemektir Resources. Bu doğru çalışıyor.

Tek bir görmezden gelme dosyasıyla aynı şeyi yapabilir miyim? Farklı dizinlerdeki pek çok görmezden gelen dosyaya sahip olmayı biraz hantal buluyorum.

Başarmaya çalıştığım şey bu:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Ancak bu tam tersi çıktı verir. *.fooTürleri yok sayar ve diğer dosyaları izler.

Yanıtlar:


109

@SimonBuchan doğru.

Git 1.8.2'den beri Resources/** !Resources/**/*.fooçalışıyor.


1
Bu benim için çalışıyor, biraz ince ayar, sadece dizinleri ve altındaki her şeyi kaldırmam gerekiyor, bu yüzden yaptım: DirectoryName1/** DirectoryName1/**/*her biri için. Firmalar dizinleri kaldırır, ancak tüm dosya türlerini kaldırmak için ikinciye ihtiyacınız vardır.
Scala Enthusiast

27

En iyi yanıt, aşağıdakileri içeren Kaynaklar altına bir Resources / .gitignore dosyası eklemektir:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

Bu .gitignore dosyasını eklemek istemiyorsanız veya ekleyemiyorsanız, uygun olmayan bir çözüm vardır:

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Belirtilenden daha derin dizinler eklerseniz, bu kalıbı düzenlemeniz gerekecektir.


2
Bu üzücü .. Gerçekten daha derin dizinlere sahip olacağım, bu yüzden
ilkine bağlı kalacağım

Aynı çözümle ilgili daha fazla ayrıntıyı burada bulabilirsiniz: stackoverflow.com/questions/7803689/… - ayrıca yukarıda OP @nawfal tarafından bağlanmıştır
burada

7

Bu aptalca görünebilir, ancak daha önce yok saymaya çalıştığınız klasörü / dosyaları daha önce eklemediyseniz kontrol edin. Yaptıysanız, .gitignore dosyanıza ne koyduğunuz önemli değil, klasörler / dosyalar yine de hazırlanacaktır.


5
Birisi bu özel kullanım durumuyla karşılaşırsa, onu git rm --cached <path to files>dosya sisteminde bırakırken, yok sayılan dosyaları git'ten temizlemek için kullanabilirsiniz .
slothluvchunk

5

Ya yanlış yapıyorum ya da kabul edilen cevap artık mevcut git ile çalışmıyor.

Aslında doğru çözümü buldum ve hemen hemen aynı soru altında burada yayınladım . Daha fazla ayrıntı için oraya gidin.

Çözüm:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo

2
Evet, bu benim için çalışıyor. !/Resources/**/Git'in alt dizinleri görmezden gelmemesi için öğesini eklemek çok önemliydi.
Johnster
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.