gitignore dizindeki tüm uzantı dosyaları


192

Bir dizindeki türdeki tüm dosyaları yok saymanın bir yolu var mı?

** Görünüşe göre git anlamsız, bu işe yaramaz:

/public/static/**/*.js

Fikir, keyfi iç içe klasörleri eşleştirmektir.


Yanıtlar:


123

Hiç denemedim ama git help ignorebir koyarsanız düşündürmektedir .gitignoreile *.jsde /public/static, bu ne istediğini yapacağız.

Not: Aşağıdaki Joeys'in cevabını da kontrol ettiğinizden emin olun: belirli bir alt dizindeki dosyaları yoksaymak istiyorsanız, yerel bir .gitignore doğru çözümdür (yerellik iyidir). Ancak tüm deponuza uygulamak için aynı desene ihtiyacınız varsa, ** çözüm daha iyidir.


19
En iyi çözüm gerekli değildir. İnsanların, dosyalarının neden göz ardı edildiğini bulmak için farklı .gitignore dosyalarını incelemesi gerekebilir. Bazıları tüm bu bilgilerin repo kök dizininde depolanan bir .gitignore dosyasında olmasını tercih eder.
haren

1
@haren tek çözüm değil - Joey'nin yanıtı da kesinlikle geçerli. Sizin için en uygun olanı seçin. Bir dizinde yerel olan kuralları görmezden gelmenin bu dizinde olması ve genel kuralların genel olması gerektiğini savunuyorum. (Ayrıca, bu cevap eski ve o zaman ** desteklendiğini düşünmüyorum).
ptyx

211

**Sözdiziminin dokümantasyona göre gitsürüm itibariyle desteklendiği anlaşılmaktadır .1.8.2.1

**Tam yol adına karşılık gelen desenlerde art arda iki yıldız (" ") özel bir anlama sahip olabilir:

  • Başında bir " **" ve ardından eğik çizgi tüm dizinlerde eşleşme anlamına gelir. Örneğin, " **/foo" dosya veya dizini " foo" herhangi bir yerde, " foo" deseniyle aynı şekilde eşleştirir . " **/foo/bar" bar, doğrudan dosya " " altındaki herhangi bir yerde " " dosya veya dizini ile eşleşiyor foo.

  • Sondaki " /**" içindeki her şeye uyuyor. Örneğin, " abc/**" dizinin içindeki tüm dosyaları dosyanın abckonumuna göre .gitignoresonsuz derinlikle eşleştirir .

  • Bir eğik çizgi ve ardından art arda iki yıldız, ardından bir eğik çizgi sıfır veya daha fazla dizinle eşleşir. Örneğin, " a/**/b" , " " a/b, " a/x/b", " a/x/y/b" vb. İle eşleşir .

  • Ardışık diğer yıldız işaretleri geçersiz kabul edilir.


1
xxx/**ve arasındaki fark xxx/nedir?
thuzhf

9
xxx/**hedefler tüm dosyaları ve dizinleri içinde xxxoysa xxx/hedefleri xxxdizini doğrudan. Bu gerçekten sadece !"Bu dosyanın üst dizini hariç tutulursa bir dosyayı yeniden eklemek mümkün değildir." Şeklinde kalıpları reddetirken önemlidir , bu nedenle bu durumda kullanmak xxx/*veya kullanmak xxx/**gerekir.
joeyhoer

4
.Meta ile biten tüm dosyalar git tarafından yoksayılmalıdır. Bu nasıl çalışıyor? **.js?
Siyah

"Ardışık diğer yıldız işaretleri geçersiz kabul edilir." hepsini
topluyor

68

GÜNCELLEME: @ Joey'nin cevabına bir göz atın : Git artık **kalıplardaki sözdizimini destekliyor . Her iki yaklaşım da iyi çalışmalıdır.


Gitignore (5) kılavuz sayfasına durumları:

Yolla aynı dizindeki veya herhangi bir üst dizindeki bir .gitignore dosyasından okunan desenler, daha üst düzey dosyalardaki (çalışma ağacının en üst düzeyine kadar) desenler dizine kadar alt düzey dosyalardakiler tarafından geçersiz kılınır dosyayı içeren.

Bunun anlamı, repo'nuzun .gitignoreherhangi bir dizinindeki bir dosyadaki desenlerin o dizini ve tüm alt dizinleri etkileyeceğidir .

Sağladığınız desen

/public/static/**/*.js

tam olarak doğru değil, çünkü (doğru bir şekilde belirttiğiniz gibi) **sözdizimi Git tarafından kullanılmıyor. Ayrıca, önde gelen bu yolu yol /adının başına bağlar. (Yani, /public/static/*.jsmaç olacak /public/static/foo.jsama değil /public/static/foo/bar.js .) Lider çıkarma /gibi ya çalışmaz eşleşen yolları public/static/foo.jsve foo/public/static/bar.js. DÜZENLEME: Önde gelen eğik çizgiyi kaldırmak da işe yaramaz - desen hala bir eğik çizgi içerdiğinden, Git tarafından düz, özyinelemesiz bir kabuk glob olarak kabul edilir ( bunu işaret ettiği için @Joey Hoer'a teşekkürler ).

@Ptyx'in önerdiği gibi, yapmanız gereken dosyayı oluşturmak <repo>/public/static/.gitignoreve sadece bu kalıbı dahil etmektir :

*.js

Öncü yoktur /, bu nedenle yolun herhangi bir bölümünde eşleşir ve bu desen yalnızca /public/staticdizindeki ve alt dizinlerindeki dosyalara uygulanır .


2
Bu tamamen doğru değildir - özellikle "Satır aralığını kaldırmak, ve /gibi yolları eşleştirmek için de çalışmaz ." yanlış. Alıntı belgelere desen bir eğik çizgi içermiyorsa"/, iş ağacın eğer toplevel için (göreceli .gitignore dosyanın bulunduğu yere yol adı göreli karşı maç için bir kabuk glob desen ve çekler gibi Git davranır onu bir .gitignore dosyasından değil). " desen a içermediğinden eşleşmez . public/static/foo.jsfoo/public/static/bar.jsfoo/public/static/bar.js/
joeyhoer

@JoeyHoer teşekkürler, cevabımı buna göre güncelledim.
Adam Sharp

9

İzlenmeyen dosyaları yok saymak için .git / info / exclude adresine gidin. Hariç tut, yok sayılan uzantıların veya dosyaların listesini içeren bir dosyadır.


2
Bu, .gitignore'un (tabii ki işlendikten sonra) yaptığı gibi havuzun diğer klonlarına taşınmaz.
jpmc26

3

Bence en basit çözüm kullanmak olacaktır find. .gitignoreAlt dizinlerde birden fazla takılmayı sevmiyorum ve benzersiz, üst düzey bir yönetmeyi tercih ediyorum .gitignore. Bunu yapmak için bulunan dosyaları bilgisayarınıza ekleyebilirsiniz .gitignore. Varsayalım ki /public/static/projeniz / git home Ben şöyle bir şey kullanırsınız:

find . -type f -name *.js | cut -c 3- >> .gitignore

Gitmek ./için hangi dosyaların kaçınacağını anlamak için başlangıçta kesmenin genellikle gerekli olduğunu buldum . Bu nedenle cut -c 3-.

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.