Birden çok .gitignore kaşlarını çattı mı?


239

Bir repo birkaç bağımsız projeden oluşmadığı sürece, repo'nun .gitignorekökünde bir dosyaya sahip olmak , çeşitli dosyalardan daha basit olurdu . Bir yaklaşımın diğerinden daha iyi olduğu konusunda çevrimiçi olarak veya çevrimiçi olarak yapılan bazı analizlerde standart bir en iyi uygulama var mı?

Yanıtlar:


254

.gitignoreFarklı (alt) dizinlerde birden fazla dosya olmasını istediğiniz en az iki durumu düşünebilirim .

  • Farklı dizinlerin göz ardı edilecek farklı dosya türleri vardır. Örneğin .gitignore, projenizin üst dizinindeki oluşturulan programlar oluşturulmuş programları Documentation/.gitignoreyok sayarken, oluşturulan belgeleri yok sayar.

  • Sadece verilen (alt) dizininde (kullanabileceğiniz verilen dosyaları görmezden /sub/fooiçinde .gitignoreolsa).

Lütfen .gitignoredosyadaki desenlerin, dosya içinde bulunduğu (alt) dizine ve tüm alt dizinlerine özyinelemeli olarak uygulandığını unutmayın (desen '/' içermiyorsa (örn. Desen , verilen dizinde nameadlandırılan herhangi bir dosyaya nameve tüm alt dizinlerine /nameuygulanırken dosyaya uygulanır) bu adla yalnızca verilen dizinde).


1
Ah, bazı nedenlerden dolayı /Documentation/*.html'in bunu kapsayacağını düşündüm, ancak * joker kartın yalnızca bir düzeydeki dizinlerle eşleşeceğini düşünüyorum.
Conley Owens

9
@ConleyOwens: Modern Git ile kullanabilirsiniz Documentation/**/*.html(herhangi bir eğik çizginin deseni tutturduğunu unutmayın; /foodosyayı doğrudan dizine tutturmak için kullanılır)
Jakub Narębski

97

Teğetsel bir not olarak, birden fazla .gitignoredosyaya sahip olmanın çok yararlı olduğu bir durum, çalışma kopyanızda asla taahhüt etmeyi istemediğiniz ekstra bir dizin istiyorsanız. .gitignoreBu dizine 1 baytlık (sadece tek bir yıldız işareti içeren) koyun ve hiçbir zaman görünmez git status.


4
bunun için ".git / info / exclude" dosyasını da kullanabilirsiniz
Ayell

10
Tabii, bir dosyayı depo kökü dışında bir yerde açmak zorunda kalmanın sakıncası yoksa, içine tüm bir yol yazıp dizini silerseniz / sildiğinizde girişi temizlemeyi unutmayın. Bunu ile karşılaştırın printf \* > .gitignore(dizini sildiğinizde temizleme otomatiktir). .git/info/excludeDaha uygun seçimin olduğu, ancak pek çoğunun olmadığı durumlar olduğundan eminim .
Aristoteles Pagaltzis

Evet, bir klasör yerine bir dosyayı hariç tutmak istediğinizde: p
Ayell

4
Cevabımda “çalışma kopyanızda asla taahhüt etmeyeceğiniz fazladan bir dizin istiyorsanız” dedim.
Aristoteles Pagaltzis

1
Kök .gitignore'da daha az dağınıklık yarattığından, bu yaklaşımı çok seviyorum.
David A. Gray

59

.gitignoreHer biri kendi dizininde olmak üzere birden çok öğeye sahip olabilirsiniz .
Bir dosya, kullanımını görmezden sorumlu olan gitignore kuralı kontrol etmek için git check-ignore: git check-ignore -v -- afile.

Ve .gitignoredal başına bir dosyanın farklı bir sürümüne sahip olabilirsiniz : Zaten bir dalın bir dosyayı bir dosyayı yoksaymasını sağlamak için bu tür bir yapılandırmayı diğer dalı yapmıyorken gördüm: örneğin bu soruya bakın .

Reponuzda birkaç bağımsız proje varsa, bunlara alt modül olarak başvurmak en iyisidir .
Bu, en iyi uygulamalar olacak ve bu projelerin her birinin bağımsız bir şekilde (ilgili .gitignoredosyalarla) klonlanmasına izin verirken, küresel bir ana projede belirli bir revizyonla referans gösterilecektir.
Daha fazla bilgi için alt modüllerin gerçek yapısına bakın .


Git 1.8.2'den (Mart 2013) beri, git check-ignore -v -- yourfilehangi gitignore çalışmasının (hangi .gitignoredosyadan) uygulandığını görmek için bir ` yourfile` yapabileceğinizi ' ' ve söz konusu dosyanın neden göz ardı edildiğini daha iyi anlayabileceğinizi unutmayın.
Bkz. " Dosyam hangi gitignorekural yoksayılıyor? "


17

Pro single

  • Bulması kolay.

  • Repoda birkaç seviyede birden fazla gitignore'um varsa, dışlama kurallarını avlamak oldukça zor olabilir.

  • Birden çok dosyayla, genellikle oldukça küçük bir çoğaltma ile sarılırsınız.

Profesyonel çoklu

  • Dosya ağacının gerekli olduğu yere "bilgi" girer.

  • Git yalnızca dosyaları izlediğinden, boş bir .gitignore "boş" bir dizin yürütmenin tek yoludur.

    (Gibi Ve Git 1.8 öncesinde tek yolu bir desen dışlamak my/**.exampleyaratmaktı my/.gitignoredesenle içinde **.foo. Yapabileceğiniz gibi bu sebebi, şimdi geçerli değildir /my/**/*.example.)


Tüm hariç tutulanları bulabileceğim tek bir dosyayı tercih ederim. Dizin başına .svn'yi hiç kaçırmadım ve dizin başına .gitignore'u da kaçırmayacağım.

Bununla birlikte, çoklu gitignorlar oldukça yaygındır. Bunları kullanırsanız, en azından çalışmalarını makul kılmak için kullanımlarında tutarlı olun. Örneğin, onları kökten yalnızca bir düzey dizinlere koyabilirsiniz.


"boş bir .gitignore" boş "bir dizin yürütmenin tek yoludur." Aslında tek bir README dosyası (veya emptybu konu için adlandırılmış bir dosya) yüklemenin daha yaygın olduğunu görüyorum .
Marc.2377

6
.gitkeep bunu yapmanın da güzel bir yoludur ... sadece başka bir kongre. Ben bir readme dosyası kullanma fikrini seviyorum, çünkü o zaman dizinin ne için kullanıldığını açıklayabilirsin, o beni oku dosyasında.
Gavin Pickin

8

Eğer Git repoya ama içinde dosyalar olmadan bir dizin işlemek isteyen birçok senaryo, örneğin vardır logs, cache, uploadsrehberler vs

Yani her zaman yaptığım .gitignorebu dizinlere aşağıdaki içeriğe sahip bir dosya eklemek :

*
!.gitignore

Bu .gitignoredosyayla Git, bu dizinlerdeki hiçbir dosyayı izlemeyecek, ancak yine de .gitignoredosyayı eklememe ve dolayısıyla dizinin kendisini repoya eklememe izin veriyor .

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.