Git'teki bir dizindeki dosyaları nasıl yok sayabilirim?


544

.gitignoreBir dizindeki dosyaları yoksaymak için dosyanın doğru sözdizimi nedir ?

Olurdu

config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*

veya

/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*

?


5
yok .gitignoresaydığı dosyalar ve dizinler arasındaki fark nedir? örneğin, datavs data/farklı şeyler ifade ediyor mu?
Charlie Parker

6
@CharlieParker yes-ish: eşleşen datadosyaları ve dizinleri data/yoksayar, sadece eşleşen dizinleri yoksayar.
jox

Yoksaymaya çalıştığınız dosyayı sahnelemiş veya işleyip işlemediğinizi her zaman hatırlayın, o zaman görmezden gelmenin bir yolu yoktur :( Sadece 2 sent benim desenimi yanlış yaptığımı ve bir saatin çeyreğini boşa harcadığımı düşündükten sonra
Adam

@Adam doğru .gitignore güncellemek gerekir sonra unstage / git rm - dosyayı önbelleğe aldı.
Chris McKnight

Yanıtlar:


374

KALIP FORMATI

  • Boş bir satır hiçbir dosyayla eşleşmez, böylece okunabilirlik için bir ayırıcı görevi görebilir.

  • İle başlayan bir satır #yorum olarak kullanılır.

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

  • Desen eğik çizgi ile biterse, aşağıdaki açıklama amacıyla kaldırılır, ancak yalnızca bir dizinle eşleşme bulur. Başka bir deyişle, foo/bir dizini foove altındaki yolları eşleştirir , ancak normal bir dosya veya sembolik bir bağlantıyla eşleşmez foo(bu, yolspec'in git'te genel olarak nasıl çalıştığı ile tutarlıdır).

  • Kalıp eğik çizgi içermiyorsa /, git bir kabuk glob kalıbı gibi davranır ve .gitignoredosyanın konumuna göre (dosyadan değilse çalışma ağacının en üst düzeyine göre) yol adına karşı eşleşme olup olmadığını denetler .gitignore.

  • Aksi takdirde, git muamele de kullanımına uygun bir kabuk glob olarak desen fnmatch(3)ile FNM_PATHNAMEbayrak: desende joker bir maç olmayacak /yol adında. Örneğin, Documentation/*.htmleşleşir Documentation/git.htmlancak eşleşmez Documentation/ppc/ppc.htmlveya tools/perf/Documentation/perf.html.

  • Başında eğik çizgi, yol adının başlangıcıyla eşleşir. Örneğin, /*.ceşleşir cat-file.cancak eşleşmez mozilla-sha1/sha1.c.

Daha fazlasını burada bulabilirsiniz

git help gitignore
veya
man gitignore


2
Bir .gitignore dosyasını en üst düzeye nasıl yerleştirebilir ve altındaki herhangi bir klasör için nasıl çalıştırabilirim? Teşekkür ederim.
Royi

104
-1 TL; DR ve soruyu zar zor cevaplar. Dizinler ile ilgili, dosyalar değil, bu yüzden cesur bölüm sadece bazı zihinsel jimnastik ile apropos. @Jefromi daha doğrudan oldu.
Bob Stein

Adamı okudum ve @ Jefromi'nin cevabı daha iyi - siz de @ jox'un uyarısını da okuduğunuz sürece - ve @ Luke Hutton'un örneğin IDE proje dosyalarını göz ardı etmek için daha yararlı olabilir.
WillC

1
Bu aslında git belgelerinden bir kopyala yapıştır
mcont

1
Emin değilim (aslında) bir mansayfayı veya resmi dokümanı kopyala yapıştırmak SO için en iyi formattır ...
jdk1.0

183

Birincisi olurdu. Klasör yapısı yerine uzantılara göre git.

Yani benim örnek C # geliştirme görmezden dosya:

#OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Güncelleme

Aşağıdaki yorumlardan bir güncelleme yapacağımı düşündüm. OP'nin sorusunu doğrudan cevaplamasa da, daha fazla örnek için aşağıdakilere bakın.gitignore sözdizimi .

Topluluk wiki'si (sürekli güncellenmektedir):

Visual Studio Projeleri ve Çözümleri için .gitignore

Belirli bir dil kullanımına ilişkin daha fazla örnek burada bulunabilir (Chris McKnight'ın yorumu sayesinde):

https://github.com/github/gitignore


5
@Stallman, bu range. Eşleştiği Yani *.Objsıra sıra *.obj.
norbert

131

Eğik çizgiler içeren yollar .gitignore dosyasını içeren dizine göreceli olarak alınır - genellikle deponuzun en üst düzeyidir, ancak bunları alt dizinlere de yerleştirebilirsiniz.

Böylece, verdiğiniz tüm örneklerde, yollar eğik çizgiler içerdiğinden, iki sürüm aynıdır. Orada ne zaman bir lider çizgi koymak gereken tek zamandır olmadığı zaten yolunda bir. Örneğin, fooyu yalnızca deponun en üst düzeyinde yoksaymak için kullanın /foo. Sadece yazmak foo, deponun herhangi bir yerinde foo adı verilen herhangi bir şeyi yok sayar.

Joker karakterleriniz de gereksizdir. Bir dizinin tamamını yoksaymak istiyorsanız, dizine bir ad vermeniz yeterlidir:

lib/model/om

Joker karakterleri sahip olduğunuz şekilde kullanmanın tek nedeni, daha sonra dizinde bir şeyi göz ardı etmek istiyorsanız:

lib/model/om/*      # ignore everything in the directory
!lib/model/om/foo   # except foo

5
Bu soru için kabul edilen cevaptan daha iyi bir açıklama
eerrzz

78

Başında eğik çizgi, yoksay girişinin yalnızca .gitignore dosyasının bulunduğu dizine göre geçerli olduğunu gösterir. Belirtilmesi *.o, bu dizindeki ve tüm alt dizinlerdeki tüm .o dosyalarını yoksayar, /*.oyalnızca bu dizinde /foo/*.oyoksayırken, yalnızca /foo/*.o içinde yok sayar.


34

.Gitignore dosyasını en üst düzeye koymak ve altındaki herhangi bir klasör için çalışmasını istiyorsanız /**/ .

Örneğin *.map, bir /src/main/klasördeki ve alt klasörlerdeki tüm dosyaları yoksaymak için şunu kullanın:

/src/main/**/*.map

Bunu yapmam gerekiyordu. Neden iki kişiye ihtiyacınız olduğundan emin değilim **. Biri benim için yeterliydi.
Novocaine

8
** ayrıca alt dizinlerdeki dosyalarla da eşleşir
petrsyn

Bilgi @petrsyn için teşekkürler
Novocaine

30

Her iki örnek de veri kaybına yol açabilecek çok kötü örneklerdir!

Benim tavsiyem: asla ekleme /* Eğer iyi bir nedeniniz yoksa .gitignore dosyalarındaki dizinlere !

İyi bir neden, örneğin Jefromi'nin yazdığı şey olabilir: "daha sonra dizindeki bir şeyi göz ardı etmek istiyorsanız" .

Aksi halde yapılmaması gereken neden, /* , dizinlere bir yandan dizinin tüm içeriğini doğru şekilde görmezden geldiği şekilde çalışması, ancak diğer yandan tehlikeli bir yan etkiye sahip olmasıdır:

Yürütürseniz git stash -u(geçici izlenen ve izlenmeyen zulası dosyalara) ya da git clean -df(izlenmeyen silmek ancak göz ardı dosyaları tutmak) sizin depoda, eklenmiş bir yok sayılır tüm dizinleri /*olacak geri dönüşü olmayan silindi !

Bazı arka plan

Bunu zor yoldan öğrenmek zorunda kaldım. Benim takımımda Biri ekleme oldu /*bizim .gitignore bazı dizinlere. Zaman içinde bazı dizinlerin aniden yok olacağı durumlar yaşadım. Uygulamamızın ihtiyaç duyduğu gigabayt yerel verilere sahip dizinler. Kimse açıklayamadı ve her zaman tüm verileri yeniden indirmek için şapka kullanıyorum. Bir süre sonra bununla ilgili olabileceği konusunda bir fikrim var git stash. Bir gün yerel repo'yu (yok sayılan dosyaları tutarken) temizlemek istedim ve kullanıyordum git clean -dfve yine verilerim kayboldu. Bu kez yeterince sorun yaşadım ve sorunu araştırdım. Sonunda sebebin eklendiğini anladım /*.

Bir şekilde directory/*dizinin tüm içeriğini görmezden geldiği , ancak dizinin kendisini bir şekilde açıklayabileceğini varsayıyorum . Böylece, işler silindiğinde ne izlenir ne de göz ardı edilir. Olsa da git statusvegit status --ignored üzerinde biraz farklı bir resim verin.

Nasıl çoğaltılır

Davranışı nasıl yeniden oluşturacağınız aşağıda açıklanmıştır. Şu anda Git 2.8.4 kullanıyorum.

İçinde localdata/kukla bir dosya ile çağrılan bir dizin ( important.dat) yerel bir git deposunda oluşturulacak /localdata/*ve .gitignoredosyaya yerleştirilerek içerik yok sayılacaktır . Bahsedilen iki git komutundan biri şimdi yürütüldüğünde, dizin (beklenmedik şekilde) kaybolacaktır.

mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file

Eğer bir yaparsanız git status --ignoredburada elde edersiniz:

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

  untracked-file

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

  localdata/

Şimdi ya

git stash -u
git stash pop

veya

git clean -df

Her iki durumda da göz ardı edildiği iddia edilen dizin localdata kaybolacaktır!

Bunun bir hata olarak kabul edilip edilemeyeceğinden emin değilim, ama en azından kimsenin ihtiyaç duymadığı bir özellik.

Bunu git geliştirme listesine bildireceğim ve bunun hakkında ne düşündüklerini göreceğim.


15

Olurdu:

config/databases.yml
cache
log
data/sql
lib/filter/base
lib/form/base
lib/model/map
lib/model/om

hatta muhtemelen:

config/databases.yml
cache
log
data/sql
lib/*/base
lib/model/map
lib/model/om

bu durumda filterve lib'de göz ardı edilmesi formgereken bir basealt dizine sahip olan tek dizin ise (asteriklerle neler yapabileceğinizin bir örneği olarak bakın).


14

İlki. Bu dosya yolları, .gitignore dosyanızın bulunduğu yerden görecelidir.


2
Bu sadece eğik çizgi içeren desenler için geçerlidir. "Mydir" gibi tek bir dizin adı, herhangi bir derinlikte alt klasörlerde bulunan dizinleri (ve dosyaları) yoksayar. Yalnızca öne eğik çizgi koymak, .gitignore dosyanızın bulunduğu yerden göreli olur.
jox

4

Https://www.gitignore.io adresinde.gitignore kolayca şablonlar oluşturmanıza olanak tanıyan bir GUI ve CLI tabanlı hizmet sağlıyorum .

Arama alanına istediğiniz şablonları yazabilir veya komut satırı diğer adını yükleyebilir ve çalıştırabilirsiniz.

$ gi swift,osx


0

Android Studio projesi için örnek bir .gitignore dosyası aşağıdaki gibi görünebilir

# built application files
*.apk
*.ap_

# files for the dex VM
*.dex

# Java class files
*.class

# generated files
bin/
gen/

# Local configuration file (sdk path, etc)
local.properties


#Eclipse
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
YourProjetcName/.gradle/
YourProjetcName/app/build/
*/YourProjetcName/.gradle/
*/YourProjetcName/app/build/

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# CDT-specific
.cproject

# PDT-specific
.buildpath

# Proguard folder generated by Eclipse
proguard/

# Intellij project files
*.iml
*.ipr
*.iws
.idea/
/build
build/
*/build/
*/*/build/
*/*/*/build/
*.bin
*.lock
YourProjetcName/app/build/
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
.gradle/
app/build/
*app/build/

# Local configuration file (sdk path, etc)
local.properties
/YourProjetcName/build/intermediates/lint-cache/api-versions-6-23.1.bin
appcompat_v7_23_1_1.xml
projectFilesBackup
build.gradle
YourProjetcName.iml
YourProjetcName.iml
gradlew
gradlew.bat
local.properties
settings.gradle
.gradle
.idea
android
build
gradle
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.