.gitignore klasörü hariç tut, ancak belirli bir alt klasör ekle


964

İçin application/eklediğim klasöre sahibim .gitignore. application/Klasörün içinde klasör bulunur application/language/gr. Bu klasörü nasıl ekleyebilirim?

Bunu denedim

application/
!application/language/gr/

şanssız ...


1
Umarım, " .gitignorekalıp biçimi" dokümantasyonu daha da netleşmiştir (Aralık 2013). Aşağıdaki cevabımı
VonC

En sevdiğim soru ve cevabım, favorilere ek olarak tarayıcı yer imlerine eklendi.
codekiddy

Yanıtlar:


1612

Hariç tutursanız application/, altındaki her şey her zaman hariç tutulur (daha sonra negatif hariç tutma kalıbı (“unignore”) altında bir şeyle eşleşebilse bile application/).

İstediğinizi yapmak için, “unignore” etmek istediğiniz herhangi bir şeyin her üst dizinini “unignore” etmeniz gerekir. Genellikle bu durum için kurallar çift olarak yazılır: bir dizindeki her şeyi göz ardı edin, ancak belirli bir alt dizini yoksayın.

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

Not
Firar /*önemlidir:

  • Örüntü dir/adlı bir dizini dirve altındaki her şeyi (dolaylı olarak) hariç tutar . Git
    ile dir/hiçbir zaman altındaki hiçbir şeye bakmayacak dirve bu nedenle hiçbir zaman “hariç tutma” örüntülerinin hiçbirini altındaki hiçbir şeye uygulamaz dir.
  • Örüntü kendisi dir/*hakkında hiçbir şey söylemez dir; sadece altındaki her şeyi hariç tutar dir. İle dir/*Git, dirdiğer kalıplara içeriğin bir kısmını "hariç tutma" şansı vererek doğrudan içeriğini işleyecektir ( !dir/sub/).

12
Sondaki yıldız işaretleri önemli mi? Eğer öyleyse, anlamdaki fark nedir? Gitignore belgelerinde açıklanan algoritmaya göre , bir eğik çizgi ile biten bir dizin ve o dizinin altındaki yollarla eşleşir. Bir yıldız işareti ile bitmek daha sonra bir glob paterni olarak tedaviye düşecektir. Deneme, yıldız işaretinin çalışmasını gösteriyor, ancak sadece bir eğik çizgi ile biten değil. Bunun neden böyle olduğunu anlamak istiyorum.
seh

123
@seh: Evet, sondaki takip /*önemlidir. Bir dizin hariç tutulursa Git hiçbir zaman bu dizinin içeriğine bakmaz. Örüntü dir/adlı bir dizini dirve altındaki her şeyi (dolaylı olarak) hariç tutar . Örüntü kendisi dir/*hakkında hiçbir şey söylemez dir; sadece altındaki her şeyi hariç tutar dir. dir/Git ile hiçbir zaman altındaki hiçbir şeye bakmayacak dirve bu nedenle hiçbir zaman “hariç tutma” örüntülerinin hiçbirini altındaki hiçbir şeye uygulamaz dir. İle dir/*Git, dirdiğer kalıplara içeriğin bir kısmını "hariç tutma" şansı vererek doğrudan içeriğini işleyecektir ( !dir/sub/).
Chris Johnsen

7
Ah, bu açıklıyor. Gitignore belgelerini kaç kez okuduğum önemli değil, tersine çevrilmiş kalıpların işe yaramadığını asla anlayamadım. Açıklamanızla, şimdi açık. Gitignore belgeleri Bunun nasıl açıklamak için bir "reçete" bölümü bulunur.
seh

8
Ben (deli .gitignore dosyası!) Çalışmak için bu oldukça alamadım, bu yüzden sadece istediğim dizine cd'ing sonra dosyaları zorla ekledi. git add -f .
K0D4

2
Çıktısına güvenemeyeceğinizi unutmayın, bu size git statusen üst düzey dizinin ekleneceğini söyleyecektir. Bunun yerine, git addüst düzey git statusdizinden birini yapın ve desenle eşleşen dosyaların alt kümesini (umarız) listeleyecektir.
Matthew Strawbridge

136

59856de Teslim gelen Karsten Blees (kblees) Git için 1.9 / 2.0 (Q1 2014) açıklık getirmektedir durumda olduğu:

gitignore.txt: hariç tutulan dizinlerin özyinelemeli niteliğini netleştirme

!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 2.8+ sürümünde belirli koşullar karşılanmadığı sürece, aşağıya bakın)
Git, performans nedenlerinden dolayı hariç tutulan dizinleri 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
 --------------------------------------------------------------

Senin durumunda:

application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**

Belirli bir klasördeki dosyaları beyaz listeye alabilmek için önce klasörleri beyaz listeye almanız gerekir .


Güncelleme Şubat / Mart 2016:

Git 2.9.x / 2.10 (2016 ortası?) İle, yeniden eklenen yolda joker karakter yoksa, dosyanın üst dizini hariç tutulursa bir dosyayı yeniden eklemek mümkün olabilir .

Nguyễn Thái Ngọc Duy ( pclouds) bu özelliği eklemeye çalışıyor:

Yani git 2.9+ ile, bu gerçekten işe yarayabilirdi, ama sonuçta geri döndü:

application/
!application/language/gr/

Windows için git cevabınızın sonunda yayınlanan güncellenmiş yeniden dahil sözdizimini kullanmaya çalıştım v2.8.1.windows.1ama işe yaramıyor :(
David Hancock

1
@DavidHancock Üzgünüm, cevabı düzenledim: bu henüz mevcut değil.
VonC

1
@DavidHancock da beni: Bu birden fazla kez düzenlemek zorunda 13 Yığın Taşması cevapları daha fazla!
VonC

5
Git 2.9 dün yayınlandı. Yanıtta belirtilen application/+ !application/language/gr/deseninin onaylanması beklendiği gibi çalışıyor.
Ray Shan

1
@RayShan Strange: Geri alma işleminin bu özelliği iptal ettiğini gördüm, ancak görmedim (ve github.com/git/git/blob/master/Documentation/RelNotes/2.9.0.txt sürüm notundan bahsetmiyorum) .gitignore kurallarını geliştiren herhangi bir taahhüt.
VonC

52

@Chris Johnsen'ın cevabı harika, ancak Git'in daha yeni sürümleri (1.8.2 veya üstü) ile, biraz daha kestirme çözüm için kullanabileceğiniz çift yıldız deseni var:

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

Bu şekilde, izlemek istediğiniz alt klasörün üst dizinini "unignore" etmek zorunda kalmazsınız.


Git 2.17.0 ile (Bu sürümden ne kadar erken olduğundan emin değilim. 1.8.2'ye geri dönme olasılığı), **desen (ler) inize giden her alt dizin için hariç tutulan desenlerle birlikte çalışır. Örneğin:

# assuming the root folder you want to ignore is 'application'
application/**

# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder

9
Ne yazık ki, bu başarısız olur (Git 1.8.4.msysgit.0), desen **sıfır alt klasörlerle *eşleşebilir languageve eşleştirilip hariç tutularak dahil edilmesini önler gr. Chris Johnson'un önerdiği ebeveyn zincirinin tamamı hala gerekli görünüyor.
Sean Gugler

3
Kulağa mükemmel geliyor ama git 2.3.7 ... /www/**/* !/www/config.xml !/www/resconfig.xml üzerinde çalışmıyor ve res dizini hala yok sayılıyor.
Rob

@Rob da eklemeniz gerekir !/www/res/. folder/**/*Deseni kullanabilirsiniz , ancak yine de eklenmesini istediğiniz her bir alt dizin için hariç tutmanız gerekir. Hala yoksay / hariç tut kombinasyonundan daha kısa ve okunabilir.
Ben Kane

Bunun eski bir yorum olduğunu biliyorum, ama merak ediyorsanız. Bu yaklaşımı belgeleyen cevaba bir düzenleme ekledim.
Ben Kane

21

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:
!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 sayıda deneme yanılma!


1
Not: Siparişin bir .gitignore dosyasında da önemli olduğunu unutmayın, bu nedenle !kurallarınızı en alta yerleştirdiğinizden emin olun .
starbeamrainbowlabs


8

En basit ve muhtemelen en iyi yol, dosyaları manuel olarak eklemeyi denemektir (genellikle bu, .gitignorestil stili kurallarına öncelik verir ):

git add /path/to/module

Hatta isteyebilirsiniz -N niyet eklemek size önermek, bayrak olacak ama hemen değil, bunları ekleyin. Bunu sık sık yeni dosyalar için yapıyorum, henüz sahneye çıkmaya hazır değilim.


Bu , kolayca yinelenen bir KG olabileceğine dair yanıtın bir kopyasıdır. Daha fazla görünürlük için burada yeniden gönderiyorum - gitignore kurallarını karıştırmamak daha kolay.


2
Bu cevap için teşekkürler. Benim gibi .gitignore içinde olduğu gibi -f eklemek zorunda kaldı: git add -f yolu / / dosya
jasonflaherty

6

Yani, birçok programcı düğüm kullandığından. bu soruyu karşılayan kullanım durumu , örneğin node_modulesbir modül hariç tutmaktır module-a:

!node_modules/

node_modules/*
!node_modules/module-a/

2
Git sürümü için çalışmaz 2.10.2.windows.1.
Sebastian

1
Git sürüm 2.10.2 için bu yanıtı
nalexn

👌 harika 👋 👋.
Abdennour TOUMI

6

Ek bir cevap ekleyin:

!/.vs/              <== include this folder to source control, folder only, nothing else
/.vs/*              <== but ignore all files and sub-folder inside this folder
!/.vs/ProjectSettings.json <== but include this file to source control
!/.vs/config/       <== then include this folder to source control, folder only, nothing else
!/.vs/config/*      <== then include all files inside the folder

sonuç:

resim açıklamasını buraya girin


2
Görseller yardımcı olduğu için bu benim için en yararlı cevaptı. Teşekkürler!
Joel Murphy

4

Özellikle eski Git sürümleri için önerilerin çoğu iyi sonuç vermez. Bu durumda, diğer ayarlara bakılmaksızın içeriğin dahil edilmesini istediğim dizine ayrı bir .gitignore koyarım ve gerekenlere izin veririm.

Örneğin: /.gitignore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

Yani / dependsency_files (hatta .dll dosyaları) içindeki her şey gayet iyi dahil edilmiştir.


4

Burada benzer bir durum buldum, burada laravel'de varsayılan olarak, .gitignoretüm asterix kullanarak yok sayar ve sonra genel dizini geçersiz kılar.

*
!public
!.gitignore

OP senaryosuna girdiğinizde bu yeterli değildir.

Belirli bir alt klasörü işlemek istiyorsanız public, örneğin public/productsdizininize, bir alt klasör derinliğinde dosyaları dahil etmek istediğinizi, örneğin, özellikle public/products/a/b.jpgbu şekilde ekleseniz bile, doğru algılanmayacaklarını da eklemek istediğinizi varsayalım !/public/products,!public/products/* vb ..

Çözüm, hepsini geçersiz kılmak için böyle her yol seviyesi için bir giriş eklediğinizden emin olmaktır.

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*

3

Tam olarak ne istediğinizi elde etmek için dizin yapısında yürürken başka bir örnek. Not: Hariç tutmadım Library/amaLibrary/**/*

# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme

> git add Library

> git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
    new file:   Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
    new file:   Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
    new file:   Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
    new file:   Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings

Tam olarak ne yapmak istedim ;-)
Kitze

3

WordPress'te bu bana yardımcı oldu:

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**

3

gitignore - Yok sayılacak kasıtsız izlenen dosyaları belirtir.

Belirli bir dizin foo / bar dışındaki her şeyi hariç tutma örneği ( / * - eğik çizgi olmadan, joker karakter de foo / bar içindeki her şeyi hariç tutar ):

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

WordPress için başka bir örnek :

!/wp-content
wp-content/*
!/wp-content/plugins
wp-content/plugins/*
!wp-content/plugins/my-awesome-plugin

Burada daha fazla bilgi: https://git-scm.com/docs/gitignore


2

Sık sık CLI'de bu geçici çözümü kullanıyorum, burada yapılandırmak yerine, doğrudan veya yinelenen tarafından göz ardı edilen dizinlere rağmen istediğim (alt) dizinleri tanımladığım .gitignoreayrı bir .includedosya oluşturuyorum.gitignore .

Bu yüzden ek olarak

git add `cat .include`

hazırlama sırasında, taahhütte bulunmadan önce.

OP için, .includebu satırları olan bir kullanmanızı öneririz :

<parent_folder_path>/application/language/gr/*

NOT: Kullanmak cat, .include$ HOME (veya başka bir belirli dizinin) belirtilmesi için takma adların (içinde ) kullanılmasına izin vermez . Hattı olmasıdır homedir/app1/* geçirilen git addYukarıdaki komut olarak görünür kullanılarak git add 'homedir/app1/*'( '') tek tırnak karakterleri ve çevreleyen yardımcı olur ve böylece, tırnak içinde her karakterin değişmez değerini korur (örneğin takma homedir çalışmasını) (bakınız Bash Tek tırnak işareti ).

İşte burada.include benim depoda kullandığım bir dosya örneği .

/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc

1

Jquery üretim js dosyalarını izlemek istedim ve bu çalıştı:

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*

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.