Gitignore dosyasına, içinde nokta olmayan dosyaları (tüm uzantısız dosyalar) nasıl eklerim?


112

Başlığın dediği gibi, gitignore dosyasına "içlerinde nokta olmayan dosyalar" eklemek mümkün müdür?

Bunun tüm bu rahatsız edici uzantısız dosyaları halledeceğini hayal ediyorum.


2
Orada göz ardı etmek istemiyorum bazı Uzantısı olmayan dosyaları şunlardır: README, LICENSEveya COPYING, INSTALL, Makefilevb, her zaman gerçi bunları zorla ekleyin ve sonra da izlenir
Jakub Narębski

@ JakubNarębski iyi bir nokta. Daha fazla görünürlük için cevabıma ekledim.
VonC

Yanıtlar:


121

Şuna benzer bir kombinasyon deneyebilirsiniz:

*
!/**/
!*.*

Bu gitignorehariç tutma kuralı ( olumsuzlanmış bir kalıp ), bir uzantıya sahip olanlar dışındaki tüm dosyaları yoksaymalıdır.

Aşağıda Mad Physicist tarafından belirtildiği gibi kural şudur:

Bir dosyanın üst dizini dışarıda bırakılırsa, bir dosyayı yeniden dahil etmek mümkün değildir. (*)
(*: git 2.?+ sürümünde belirli koşullar sağlanmadıkça, aşağıya bakın)

!/**/Dosyaları beyaz listeye almak istiyorsak bu nedenle önemlidir (üst klasörleri yinelemeli olarak beyaz listeye almak).

Benzer durumlarda aynı kuraldan bahsetmiştim:


As Jakub Narębski yorumların , görmezden istemeyebilirsiniz tüm extensionless dosyaları.

Benim tavsiyem:

  • önce önemli olan uzantısız dosyayı ekleyin
  • daha sonra .gitignoreyukarıda gösterildiği gibi düzenleyin : Halihazırda sürümü olan dosyalar yok sayılmaz (bir uzantıya sahip olmasalar bile). Diğerleri görmezden gelinecek.

Sürümlendirmek isteyeceğiniz gelecekteki uzantısız dosyalar için:

git add -f -- myFile

Git 2.9.x / 2.10 (2016 ortası?) İle , yola yeniden eklenen joker karakter yoksa, o dosyanın üst dizini hariç tutulursa bir dosyayı yeniden dahil etmenin mümkün olabileceğini unutmayın .

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

Ancak, yeniden dahil etme kurallarından biri şuydu:

Yeniden dahil etme kurallarındaki dizin bölümü değişmez olmalıdır (yani joker karakter olmamalıdır)

Bu zaten burada işe yaramazdı.


1
Cevap tamamen doğru. Ama belki daha iyi .gitignoreolurdu **ve !**.*. Ben yıldız önünde yerleştirilirse bu bir fark yapmaz biliyorum ama kabukları joker üstesinden gelmesinde daha açık ve ses ...
Willem Van Onsem

7
Not: Diğer dışlama kurallarıyla çalışmak için, bunun .gitignore dosyanızdaki ilk kural kümesi olması gerekir
Erik

Ayrıca belirli uzantısız dosyaları yeniden dahil edebilirsiniz, örneğin !Makefile. 1.9.0'da sorunsuz çalışırken Git 1.7.1'de bu çözümle ilgili sorunlar yaşadığıma dikkat edin. Benim durumumda, kök dizine bir dosya eklemek iyi çalıştı, ancak bir alt dizinin içine bir uzantı içeren bir dosya eklemek yoksayıldı olarak gösterildi. Bunun nedeni 1.7.1'in **henüz kalıbı desteklememesi, buraya bakın !
mxmlnkn

1
**Git'e eklendi 1.8.2. !*/Bunun yerine kullanmanın herhangi bir dezavantajı var mı !/**/?
mxmlnkn

@TamaMcGlinn Bu bir regex'e benziyor: gitignore normal ifadeleri desteklemiyor.
VonC

51
*
!*/
!*.*

* git'e her şeyi görmezden gelmesini söyler.

!*/daha sonra dizin olan her şeyi yok sayar. Bu çok önemlidir.

!*.* bir uzantıya sahip tüm dosyaları yoksayar.

Olmadan !*/kural, bir olmadan dizinleri .listelerde ismi olmaz ve istediğiniz dosyaların hiçbiri kök klasörüne dışında eklenebilir.

Başvuru için .gitignore belgelerinde öne çıkan şu iki bölümü okuyun :

İ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. Git, performans nedenlerinden ötürü hariç tutulan dizinleri listelemez, bu nedenle içerilen dosyalardaki herhangi bir örüntü, nerede tanımlanırsa tanımlansın, hiçbir etkiye sahip değildir. İlk "!" Karakterinin önüne bir ters eğik çizgi ("\") koyun. gerçek bir "!" ile başlayan desenler için, örneğin, "! önemli! .txt".

Desen eğik çizgiyle biterse, aşağıdaki açıklama amacıyla kaldırılır, ancak yalnızca bir dizinle bir eşleşme bulur. Başka bir deyişle, foo / bir foo diziniyle ve altındaki yollarla eşleşir, ancak normal bir dosya veya sembolik bir bağlantı foo ile eşleşmez (bu, genel olarak yol belirtiminin Git'te çalışma biçimiyle tutarlıdır).


1
İyi yakalama. +1. Son zamanlarda diğer maden cevaplarında kullandığım bu kuralla cevabımı güncellemeyi unutmuştum. Cevabımı buna göre güncelledim.
VonC

0

Klasörlerimde *.c, *.h, *.txt, *.csvvb. Uzantılı çok sayıda dosya ve herhangi bir uzantısı olmayan ikili dosya var. Bu yüzden çalıştırılan tüm dosyaları yok saymam gerekiyordu *.c,*.hve .gitignorebu benim için çalışıyor, .gitignoreörnekten:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
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.