Git'in dizini / * dizini göz ardı etmesi arasındaki fark nedir?


108

Git'te bir dizinin içeriğini görmezden gelmenin doğru yolunun ne olduğu konusunda kafam karıştı.

Aşağıdaki dizin yapısına sahip olduğumu varsayalım:

my_project  
     |--www  
         |--1.txt  
         |--2.txt
     |--.gitignore

Bunu koymak arasındaki fark nedir:

www

Ve bu?

www/*

Bu soruyu sormamın nedeni şudur: git'te, eğer bir dizin boşsa, git, depoda bu kadar boş dizini içermez. Bu yüzden dizinin altına fazladan bir .gitkeep dosyası ekleyen çözümü deniyordum, böylece boş kalmayacak. Bu çözümü denerken, .gitignore dosyasındaysa, aşağıdaki gibi yazıyorum:

www
!*.gitkeep

Çalışmıyor (Niyetim www altındaki tüm içeriği görmezden gelmek ama dizini saklamaktır). Ama şunu denersem:

www/* 
!*.gitkeep

O zaman işe yarıyor! Bu yüzden iki yaklaşım arasında bazı farklılıklar olması gerektiğini düşünüyorum.


Arasındaki basit bir fark binve bin/eski dosya veya klasörleri, ikincisi sadece klasörleri görmezden olacaktır. bin/*
Albay Panic

Yanıtlar:


203

Orada arasında farklılıklar olduğunu www, www/ve www/*.

Temel olarak dokümantasyondan ve kendi testlerimden, wwwbir dosya veya dizinle bir eşleşme bul, www/yalnızca bir dizinle eşleşirken, www/*dizinleri ve içindeki dosyalarla eşleşir www.

Sadece aradaki www/ve www/*buradaki farkları tartışacağım , çünkü aralarındaki wwwve arasındaki farklar www/çok açık.

Çünkü www/git dizinin wwwkendisini yok sayar , bu da git'in içine bakmayacağı anlamına gelir. Ancak for www/*, git içindeki tüm dosyaları / klasörleri kontrol eder wwwve kalıpla hepsini yok sayar *. Git, wwwtüm alt dosyaları / klasörleri göz ardı edilirse boş bir klasörü takip etmeyeceği için aynı sonuçlara yol açıyor gibi görünüyor . Ve gerçekten de sonuçlar OP'nin tek başına www/veya www/*bağımsız durumu için hiçbir fark olmayacaktır . Ancak diğer kurallarla birleştirildiğinde fark yaratır.

Örneğin, ya sadece www/1.txtiçerideki diğerlerini dahil etmek ama yok saymak istiyorsak www?

Aşağıdakiler .gitignoreişe yaramayacak.

www/
!www/1.txt

Aşağıdakiler .gitignoreişe yararken neden?

www/*
!www/1.txt

Birincisi için git, dizini görmezden gelir ve tekrar wwweklemek için içeriye bakmaz bile www/1.txt. İlk kural üst dizini hariç tutar, wwwancak hariç tutar www/1.txtve sonuç www/1.txtolarak " tekrar dahil edilemez ".

Ancak ikincisi için git önce altındaki tüm dosyaları / dosyaları yok sayar wwwve sonra bunlardan birini tekrar içerir, yani www/1.txt.

Bu örnek için, dokümantasyondaki aşağıdaki satırlar yardımcı olabilir:

İsteğe bağlı bir ön ek "!" kalıbı olumsuzlayan; önceki bir kalıp tarafından hariç tutulan eşleşen herhangi bir dosya tekrar dahil edilecektir. Bir dosyanın üst dizini dışarıda bırakılırsa, bir dosyayı yeniden dahil etmek mümkün değildir.


Bunu düşünmüyor musun www/1.txtve sonra www/ikinci yaklaşımla aynı şeyi yapmaz mısın ...
Naveed Butt

8

Sadece dokümantasyonu inceliyorum ve bildiğim kadarıyla sadece daha gelişmiş modellerde farklılık gösteriyorlar, örneğin

$ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

Ben yaptım yukarıdaki testi ve değiştirirseniz !/fooile !/foo/*, gerçekten farklı bir sonuç alırım.

Not

foo

Herhangi bir dosyayı hariç tutacak foo, ancak

foo/

sadece foo adlı dizinleri dışlayacaktır.


3

Zaten aldığınız mükemmel iyi cevapların yanı sıra, .gitignorealt klasörler de dahil olmak üzere projenizin herhangi bir yerinde alabileceğinizi unutmayın .

Yani içindeki tüm dosyaları görmezden istiyorsanız www, ancak whant wwwklasör, bunun yerine boş kullanmanın sürüm edilecek .gitkeep, .dummyya da her ne seçtiğiniz isim, neden kullanmaz .gitignoretüm dosyaları görmezden söylüyorum, orada?

/
|- .gitignore   (a)
\- www
    |- .gitignore   (b)
    |- 1.jpg
    \- 2.jpg

Kökte .gitignore(a), wwwklasör veya içeriği hakkında hiçbir şey söylemiyorsunuz .

In www/.gitignore(b) aşağıdakileri koyun:

# ignore all files in this folder except this .gitignore
*
!.gitignore

Bu şekilde her şey daha düzenli görünüyor (en azından bana).


1

Bir dizindeki dotfiles dışında her şeyi yok saymak için, aşağıdaki glob modelini kullanabilirsiniz .gitignore:

www/[^.]*

Yani fazladan .gitignorebir .keepdosyaya gerek yok , sadece wwwdizininize bir dosya ekleyin .

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.