.Gitignore dosyasını birkaç dosya dışında her şeyi yoksay


1700

Bir .gitignore dosyasının Git'in sürüm denetiminden belirtilen dosyaları gizlediğini anlıyorum. Çalışır gibi ekstra dosyalar (.auth, .dvi, .pdf, günlükler, vb.) Bir sürü üreten bir proje (LaTeX) var, ama bunların izlenmesini istemiyorum.

Ben bunu yapmak (belki de gerekir) böylece tüm dosyaları projede ayrı bir alt klasör koymak, biliyorum, çünkü ben sadece klasörü göz ardı edebilirsiniz.

Ancak, çıktı dosyalarını proje ağacının kökünde tutmanın ve Git ile izlediğim dosyalar hariç her şeyi yok saymak için .gitignore'u kullanmanın uygun bir yolu var mı? Gibi bir şey

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...

12
Kopyası stackoverflow.com/q/9162919/321973 (Ben daha yeni olduğunu biliyorum ama cevap daha doğru yoktur). Aslında bu cevap muhtemelen en iyisidir
Tobias Kienzler

Yanıtlar:


2442

!Deseni reddeden isteğe bağlı bir önek ; önceki bir kalıp tarafından hariç tutulan eşleşen dosyalar tekrar dahil edilir. Reddedilen bir kalıp eşleşirse, bu daha düşük öncelikli kalıp kaynaklarını geçersiz kılar.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*

14
Kök dizin dışındaki herhangi bir şeyde 'script.pl' adlı herhangi bir dosya zaten bulunmayacak şekilde alt klasörleri 'yok sayar' gibi görünüyor. Ben (* .pl birlikte) şimdi bu kullanıyorum ve tüm * .pl dosyaları .gitignore dosyasında alt dizinlere birçok bulunmasına rağmen göz ardı ediliyor
PandaWood

38
@PandaWood Bu sorun burada gündeme geldi (stackoverflow.com). Bu, asla reddetmediğiniz dizinler de dahil olmak üzere her şeyle eşleşen ilk ifadeden kaynaklanır. Düzeltmek için, geçerli dizindeki alt dizinlerle (yinelemeli olarak) eşleşen (! * /) Öğesini ekleyin. Bu, belirli dosyaları beyaz listeye ekleyen ebeveyn yanıtına yardımcı olmaz (alt dizinlerde bulunuyorlarsa, muhtemelen tam yolu manuel olarak belirtmek veya dizine özgü .gitignore dosyaları kullanmak istersiniz).
simont

40
Bunu çalıştıramadım. Bir klasörü görmezden geliyorum (örn. wp/) Ama bu klasördeki bazı dosyaları (ör. wp/path/to/some/location/*) Göz ardı etmek istemiyorum . Çalışmak için tek yolu yaparak oldugit add -f wp/path/to/some/location/*
trusktr

13
@simusktr simont'un !*/istisnasını kullan
Tobias Kienzler

7
Geez bu son kural: !*/bir .gitignoredosyayı çalışmak için boşvermeye yönelik nafile girişimlerimdeki tüm farkı yaratır . Çok teşekkür ederim.
racl101

628

İçindeki bir dosya dışında bir dizinin tüm içeriğini yoksaymak istiyorsanız, dosya yolundaki her dizin için bir çift kural yazabilirsiniz. Örneğin .gitignore, pippo / pluto / paperino.xml dışında pippo klasörünü yok saymak için

.gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

58
Mükemmel cevap, ama daha sonra karşılaşan foove foo/*aynı olmayan herkes için kayda değer . Bunun çalışması için temel klasör için kullanmanız gerekirfoo/*
thislooksfun

20
@Mayank Pippo italyanca Goofy, Paperino Donald Duck ve Pluto İngilizce ile aynıdır. Eskiden örnekleri programlamak için çok yaygın bir değişken isimleri üçlüsüdür. Onları tekrar okumak güzeldi .. :)
Ghidello

"X dosyası dışında bir klasörü hariç tutmak" için @thislooksfun'un söylediği şey önemlidir.
Çek teknolojisi

8
benim için çalışmıyor: node_modules / *! node_modules / bootstrap
SuperUberDuper

1
@simple_human Depo kökündeki her şeyi yoksayarsa veya söz konusu dizinlerin içinde ilgilenmek için .gitignore dosyası varsa, bu doğru olurdu.
xZero

244

Kullanmak istediğiniz /*yerine *veya */çoğu durumda

Kullanımı *geçerlidir, ancak yinelemeli olarak çalışır. O andan itibaren dizinlere bakmaz. İnsanlar !*/dizinleri tekrar beyaz listeye eklemeyi önerir , ancak en üst düzey klasörü kara listeye almak daha iyidir./*

# Blacklist files/folders in same directory as the .gitignore file
/*

# Whitelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Whitelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

Yukarıdaki kod dışındaki tüm dosyaları dikkate almayacağını .gitignore, README.md, folder/a/file.txt, folder/a/b1/ve folder/a/b2/bu son iki klasörlerde bulunan ve her şeyi. (Ve .DS_Storeve *.logdosyalar bu klasörlerde yok sayılır.)

Açıkçası ben mesela yapabileceğini !/folderveya !/.gitignoreçok.

Daha fazla bilgi: http://git-scm.com/docs/gitignore


3
Çok zekice, teşekkürler. IMO, bu, minimum dahil etme kurallarına sahip WordPress siteleri için bu konuda en iyi yoldur. Ayrıca, açık izniniz olmadan yeni eklentiler, temalar veya WP güncellemeleri kaldırılmaz veya eklenmez. GitHub Desktop kullanırken .DS_Storedosyaları yok sayılır buluyorum , ancak komut satırı aracılığıyla bu bir sorun değil. Bunu aşmak için **/.DS_Storediğer tüm kuralları aşağıya taşımak zorunda kaldım .
Jibran

7
İç sözdizimi vurgulayıcım, yayınınızın başlığına garip bir tepki veriyor.
itsadok

3
Gracias! da yapabilirsiniz beyaz liste bir klasörde dosya .. /some/folder/file.txt!
PodTech.io

Harika, * yerine * kullanmak, yukarıdaki yanıtlar yanıtlamadığında tüm sorunlarımı düzeltti. Şimdi tek sorum! / Klasör ve! / Klasör / * arasındaki fark nedir? ! / Klasörünü * olmadan kullanırsam, klasördeki tüm dosyalarda hala söyleyebildiğim değişiklikleri almaya devam eder.
dallin

1
@dallin hiçbir fark yok. Biri bir klasörü beyaz listeye, diğeri de aynı şeyi yapan klasörün alt listelerini listeler. Yapamayacağı böylece tek sorun, bir klasör veya dosyaları ebeveyni onu beyaz listeye alınması için önce beyaz listeye alınması sahiptir /*ardından !/nested/folder/*(veya eşdeğer !/nested/folderyapmadan) !/nested/veya !/nestedilk! (ve muhtemelen /nested/*arasında). Hatırlamanız gereken bir püf noktası, derinden iç içe geçmiş bir alt klasörü beyaz listeye ekliyorsanız, her alt klasördeki çocukları tamamen karartmanız gerekir ve bu kara listeler "eğik yıldız" ile biter ...
Ryan Taylor

75

Biraz daha spesifik:

Örnek: Her şeyi yok say webroot/cache- ama sakla webroot/cache/.htaccess.

cacheKlasörden sonra eğik çizgiye (/) dikkat edin :

BAŞARISIZ

webroot/cache*
!webroot/cache/.htaccess

İŞLER

webroot/cache/*
!webroot/cache/.htaccess

VS Kodu kullanıyorsanız, klasör adı yeşile döneceğinden ancak .gitkeep dosyası diğer tüm yok sayılan dosyalar gibi griye döneceğinden, .gitkeep içeren bir klasöre uyguladıktan sonra dosya renklendirmesini yanlış kullanmamaya dikkat edin; .gitkeep göz ardı edilir gibi görünecektir, ancak sağ tarafta tespit edildiğini gösteren bir 'U' olduğunu
görmelisiniz


28

Bir dizindeki bazı dosyaları yok saymak için, bunu doğru sırayla yapmanız gerekir :

Örneğin, index.php ve klasör "yapılandırma" hariç klasörüne "uygulama" her şeyi görmezden düzene ödeme dikkat .

Önce istediğin şeyi reddetmelisin.

BAŞARISIZ

application/*

!application/config/*

!application/index.php

İŞLER

!application/config/*

!application/index.php

application/*


38
Yanlış. "Her şeyi görmezden gel" den sonra ihmal ediyorsunuz.
Carlos

2
git statusDeğişikliklerinizin .gitignorebeklendiği gibi çalışıp çalışmadığını kontrol etmek için aldanmayın
Philippe Rathé

10
Eğer git statuso bakıyor ve ne ihmal ne söylemek gitmiyor bu çalışıyorsa, o zaman nasıl bilebilirsin?
kris

1
@kris Önce git önbelleğini temizle. Önce bir "git rm --cached *" yapın, sonra bir "git add --all" yapabilirsiniz, sonra "git status" size tüm yeni gitignore değişikliklerini gösterecektir.
Mark McCorkle

20

Kullanılabilir git config status.showUntrackedFiles nove izlenmeyen tüm dosyalar sizden gizlenir. Ayrıntılar man git-configiçin bakınız.


Çok sayıda dosyadan yalnızca birkaç dosyayı yürütmek istiyorsanız bu harika bir özellik!
Josh M.

16

Klasörü .gitignore'dan hariç tutmak için aşağıdakiler yapılabilir.

!app/

app/*
!app/bower_components/

app/bower_components/*
!app/bower_components/highcharts/

Bu, bower_componentsdışındaki tüm dosyaları / alt klasörleri yok sayar /highcharts.


14

Bununla ilgili bir sürü benzer soru var, bu yüzden daha önce yazdıklarımı göndereceğim:

Bunu makinemde çalışmanın tek yolu bu şekilde yapmaktı:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
*.*

#Only Include these specific directories and subdirectories and files if you wish:
!wordpress/somefile.jpg
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

Eklemek istediğiniz her düzey için içeriğe nasıl açıkça izin vermeniz gerektiğine dikkat edin. Bu yüzden temalar altında 5 alt dizinim varsa, hala bunu açıklamam gerekiyor.

Bu @ Yarin'in yorumundan: https://stackoverflow.com/a/5250314/1696153

Bunlar yararlı konulardı:

Ben de denedim

*
*/*
**/**

ve **/wp-content/themes/**

veya /wp-content/themes/**/*

Bunların hiçbiri benim için çalışmadı. Çok fazla iz ve hata!


2
Bu, yalnızca belirli dosya uzantılarını dahil etmeye çalışan tek yöntemdir. Daha da iyisi, harika ASCII sanatı yapar: gist.github.com/Wolfgange3311999/91c671f5e4d3c56cf5a1
Matthew D. Scholefield

10

Alt klasörle ilgili bir sorunum vardı.

Çalışmıyor:

/custom/*
!/custom/config/foo.yml.dist

İşler:

/custom/config/*
!/custom/config/foo.yml.dist

9

Yukarıda verilen tüm cevapları denedim, ama hiçbiri benim için işe yaramadı. Gitignore belgelerini ( burada ) okuduktan sonra, önce bir klasörü hariç tutarsanız, alt klasördeki dosya adlarının dizine eklenmediğini öğrendim. Ünlem işaretini daha sonra bir dosya eklemek için kullanırsanız, dizinde bulunmaz ve bu nedenle git istemcinize dahil edilmez.

Çözümü bulmanın yolu buydu. Çalışmak için klasör ağacımdaki tüm alt klasörler için istisnalar eklemeye başladım, bu da bir iş cehennemi. Daha sonra ayrıntılı konfigürasyonu, dokümantasyona biraz ters olan aşağıdaki konfigürasyona sıkıştırdım.

Çalışma .gitignore:

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' subfolder
/Pro/3rdparty/*
!Pro/3rdparty/domain/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

Sonuç olarak git istemcimde yalnızca Pro / 3rdparty / domain / modulename / klasörü içindeki iki dosyanın bir sonraki işlem için hazırlandığını görüyorum ve tam olarak aradığım şey buydu.

Aynı klasörün birkaç alt klasörünü beyaz listeye almanız gerekiyorsa, hariç tutma ifadesinin altındaki ünlem işareti satırlarını aşağıdaki gibi gruplandırın:

# Ignore the 'Pro' folder, except for the '3rdparty' subfolder 
/Pro/*
!Pro/3rdparty/

# Ignore the '3rdparty' folder, except for the 'domain' & 'hosting' subfolders
/Pro/3rdparty/*
!Pro/3rdparty/domain/
!Pro/3rdparty/hosting/

# Ignore the 'domain' folder, except for the 'modulename' subfolder
Pro/3rdparty/domain/*
!Pro/3rdparty/domain/modulename/

# Ignore the 'hosting' folder, except for the 'modulename' subfolder
Pro/3rdparty/hosting/*
!Pro/3rdparty/hosting/modulename/

Yoksa beklendiği gibi çalışmayacak.


Sonunda işe yarayan bir cevap. Acaba .gitignore'un nasıl çalıştığını ne zaman anlayacağım
David

8

Benim için işe yarayan şey bu, repoya sadece bir Cordova eklentisi koymak istedim:

...
plugins/*
!plugins/cordova-plugin-app-customization

8

Partiye geç kaldığımı biliyorum, ama işte cevabım.

@Joakim'in dediği gibi, bir dosyayı yok saymak için aşağıdaki gibi bir şey kullanabilirsiniz.

# Ignore everything
*

# But not these files...
!.gitignore
!someFile.txt

ancak dosya iç içe dizinlerde ise, kuralları el ile yazmak biraz zordur.

Örneğin, isterseniz tüm dosyaları atlamak için gitproje değil a.txtde bulunduğu aDir/anotherDir/someOtherDir/aDir/bDir/cDir. Sonra .gitignoreböyle bir şey olacak

# Skip all files
*

# But not `aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt`
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Yukarıda verilen .gitignoredosya, dışındaki tüm dizin ve dosyaları atlayacaktır.!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Belirttiğiniz gibi, bu kuralları tanımlamak zordur.

Bu engeli çözmek için, sizin için kuralları oluşturacak git-do-not-ignore adında basit bir konsol uygulaması oluşturdum. Projeyi detaylı talimatla github'da ağırladım .

Kullanım Örneği

java -jar git-do-not-ignore.jar "aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt"

Çıktı

!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Burada basit bir web sürümü de var

Teşekkür ederim.


7

Jerkery ve Açısal var. Bower onları monte etti

/public_html/bower_components/jquery/dist/bunch-of-jquery-files
/public_html/bower_components/jquery/src/bunch-of-jquery-source-files
/public_html/bower_components/angular/angular-files

Küçültülmüş jquery distdizinin içinde ve açısal angulardizinin içinde . Github'a bağlı kalmak için yalnızca küçültülmüş dosyalara ihtiyacım vardı. Bazıları .gitignore ile kurcalama ve ben de bunu yapmayı başardım ...

/public_html/bower_components/jquery/*
!public_html/bower_components/jquery/dist
/public_html/bower_components/jquery/dist/*
!public_html/bower_components/jquery/dist/jquery.min.js
/public_html/bower_components/angular/*
!public_html/bower_components/angular/angular.min.js

Umarım birisi bunu faydalı bulabilir.


7

Ben böyle yaptım:

# Ignore everything
*

# Whitelist anything that's a directory
!*/

# Whitelist some files
!.gitignore

# Whitelist this folder and everything inside of it
!wordpress/wp-content/themes/my-theme/**

# Ignore this folder inside that folder
wordpress/wp-content/themes/my-theme/node_modules

# Ignore this file recursively
**/.DS_Store

gig status -uİzlenmeyen dizinlerdeki dosyaları tek tek görüntülemek için kullanın - git statusyalnızca içindeki her şeyin izlendiğini düşünmenize neden olabilecek klasörleri görürsünüz.


5

Birkaç dosya ve birkaç kök klasör hariç her şeyi göz ardı etmeniz gerekiyorsa basit çözüm :

/*
!.gitignore
!showMe.txt
!my_visible_dir

Sihir içinde /*(yukarıda açıklandığı gibi) (kök) klasöründeki her şeyi yok sayar, ancak tekrar tekrar DEĞİL.


4

Ayrıca tek dosyaların reddedilmesi ile ilgili bazı sorunlar yaşadım. Onları işleyebildim, ancak IDE'm (IntelliJ) her zaman izlenen yok sayılan dosyalar hakkında şikayet etti.

git ls-files -i --exclude-from .gitignore

Bu şekilde hariç tuttuğum iki dosyayı görüntüledim:

public/
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

Sonunda, bu benim için çalıştı:

public/*
!public/typo3conf/
public/typo3conf/*
!public/typo3conf/LocalConfiguration.php
!public/typo3conf/PackageStates.php

Anahtar, önce klasörün reddedilmesiydi typo3conf/ .

Ayrıca, ifadelerin sırasının önemli olmadığı anlaşılıyor . Bunun yerine, içindeki tek dosyaları reddedebilmeniz için önce tüm alt klasörleri açıkça reddetmeniz gerekir.

Klasör !public/typo3conf/ve klasör içeriği public/typo3conf/*.gitignore için iki farklı şeydir.

Harika konu! Bu sorun beni bir süre rahatsız etti;)


3

Benim için hiçbir şey işe yaramadı çünkü lib'den bir kavanoz eklemeye çalışıyordum.

Bu işe yaramadı:

build/*
!build/libs/*
!build/libs/
!build/libs/myjarfile.jar 

Bu işe yaradı:

build/*
!build/libs

3

Bu işi aldım

# Vendor
/vendor/braintree/braintree_php/*
!/vendor/braintree/braintree_php/lib

2

OP ile benzer bir sorun vardı ama ilk 10 oylanan cevap hiçbiri gerçekten çalıştı .
Sonunda aşağıdakileri öğrendim

Yanlış sözdizimi:

*
!bin/script.sh

Doğru sözdizimi:

*
!bin
!bin/script.sh

Gitignore man sayfasından açıklama :

İsteğe bağlı bir önek "!" paterni reddeden; önceki bir kalıp tarafından hariç tutulan eşleşen dosyalar tekrar dahil edilir. Bir dosyanın üst dizini hariç tutulursa bir dosyayı yeniden eklemek mümkün değildir . Git, hariç tutulan dizinleri performans nedenleriyle listelemez, bu nedenle içerilen dosyalardaki desenlerin nerede tanımlandıklarına bakılmaksızın etkisi yoktur.

Genişletilmiş örnek:

ağaç.

.
├── .gitignore
└── bin
    ├── ignore.txt
    └── sub
        └── folder
            └── path
                ├── other.sh
                └── script.sh

$ cat .gitignore

*
!.gitignore
!bin
!bin/sub
!bin/sub/folder
!bin/sub/folder/path
!bin/sub/folder/path/script.sh

$ git status --untracked-files --ignored

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore
        bin/sub/folder/path/script.sh

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)
        bin/ignore.txt
        bin/sub/folder/path/other.sh

nothing added to commit but untracked files present (use "git add" to track)

1

öz

# Ignore everything
*

# But not these files...
!script.pl
!template.latex

Ve muhtemelen şunları içerir:

!.gitignore

Referans

Gönderen https://git-scm.com/docs/gitignore :

!Deseni reddeden isteğe bağlı bir önek " "; önceki bir kalıp tarafından hariç tutulan eşleşen dosyalar tekrar dahil edilir. Bir dosyanın üst dizini hariç tutulursa bir dosyayı yeniden eklemek mümkün değildir. Git, hariç tutulan dizinleri performans nedenleriyle listelemez, bu nedenle içerilen dosyalardaki desenlerin nerede tanımlandıklarına bakılmaksızın etkisi yoktur. Bir değişmez " " ile başlayan desenler \için ilk " !" önüne bir ters eğik çizgi (" ") koyun !, örneğin " \!important!.txt".

...

Belirli bir dizin dışındaki her şeyi hariç tutmak için örnek foo/bar( /*eğik çizgi olmadan - joker karakteri de içindeki her şeyi hariç tutar foo/bar):

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

0

Benim için işe yarayan ve kimsenin bahsetmediği bir şey buldum.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# And if you want to include a sub-directory and all sub-directory and files under it, but not all sub-directories
!subdir/
!subdir/**/*

Temel olarak, bir alt dizinin göz ardı edilmesini reddediyor gibi görünüyor, biri alt dizinin kendisi için !subdir/ve diğeri altındaki tüm dosya ve klasörlere genişleyen iki girişinizin olması gerekir.!subdir/**/*

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.