Git'te beyaz liste ve alt dizinler


92

Yalnızca metin dosyaları için bir beyaz liste oluşturdum.

*
!*.txt

Şimdi, bir alt dizinde izlenmemiş bir metin dosyam var - sub/dir/file.txtve bu GÖSTERİLMİYOR (yok sayılır). Ancak, kök dizindeki metin dosyaları gösterilir.

Bu neden ve bunu nasıl düzeltebilirim?



Dahil etmek istediğiniz dosyalar bir alt dizine mi? Eğer öyleyse, bu alt dizin zaten sizin .gitignore.
fajran

Evet. Bu dosyalar, dizin yapısında, örneğimdeki 11.1.102.55 klasörü kadar düşük olacaktır. İç içe yerleştirme, klasörler / ürünler arasında her zaman aynı değildir.
Nate

1
Bu işlevselliği biliyorum. Yüzlerce rehberimiz var. İstemediğimiz dosya türlerini açıkça görmezden gelmek, her dizin için bir gitignore yapmaktan daha hızlı olacaktır. Gerçekten beyaz liste işlevselliğini .gitignore dosyasından çıkarmanın bir yolunu arıyorum.
Nate

1
Bunun nasıl bir kopya olduğunu anlamıyorum. Diğer soru, belirli dosyaların nasıl beyaz listeye alınacağını sorarken, bu soru alt klasörler de dahil olmak üzere belirli dosya türlerinin nasıl beyaz listeye alınacağını soruyor. Aslında, daha çok stackoverflow.com/questions/8024924/… 'nin bir kopyası gibidir .
Big McLargeHuge

Yanıtlar:


147

Bu şekilde denerseniz başarısız olur, çünkü yapınızdaki dizinleri kara listeye alırsınız.

Çözmek için, bir dizin değil ve taahhüt istediğiniz dosya türlerinden biri değildir kara liste her şeyi istediğiniz dizinleri kara listeye olmasa da .

.gitignoreBu yapacak dosyası:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

Üç seviyeli yapısında bu test edilmiştir beyaz-listeleme .txtvarlığında dosyaları *.one, *.twove *.threebir kullanarak dosyaları .gitignorebenim için işleri - depo kök dizininde bulunan. Yapınızdaki .gitignoretüm dizinlere dosya eklemeniz gerekmez .

Cevap geldi dışarı Bilgiler Diğer şeyler arasında, anlamaya kullanılan bu (stackoverflow.com).


18
!.gitignoreKullanırken de girişe ihtiyacınız var, *değil mi?
sjas

2
Cevabımı şurada görebilirsiniz: stackoverflow.com/questions/987142/… Sadece /*üst düzey klasörü kara listeye almak daha yararlı olabilir , ancak tüm klasörleri yinelemeli olarak değil, bu da aslında .gitignorebeyaz listedeki bir klasörün alt klasörlerine bakılmaması gerektiği anlamına gelir .
Ryan Taylor

3

Bunu başarmanın daha basit bir yolu şudur:

# Ignore all files...
*.*

# ...except the ones we want
!*.txt

Bu işe yarar çünkü dosyanın altındaki her seviyeye gitignorebaşlamayan kalıplar uygulanır :/.gitignore

Desenin başında veya ortasında (veya her ikisinde) bir ayırıcı varsa, desen belirli .gitignore dosyasının kendi dizin düzeyine göredir. Aksi takdirde kalıp, .gitignore seviyesinin altındaki herhangi bir seviyede de eşleşebilir.

Bunu bir dizin içindeki dosyalara yapmak istiyorsanız , işler daha karmaşık hale gelir:

# Ignore all files in all directories inside subdir...
/subdir/**/*.*

# ...except the ones we want
!/subdir/**/*.txt

Bu işe yarar çünkü aşağıdakiler gitignoreiçin özel kurallar vardır **:

**Tam yol adıyla eşleşen desenlerdeki iki ardışık yıldız işaretinin (" ") özel bir anlamı olabilir:

  • Eğik çizgi ve ardından art arda iki yıldız işareti, ardından bir eğik çizgi sıfır veya daha fazla dizinle eşleşir. Örneğin, " a/**/b" " a/b", " a/x/b", " a/x/y/b" vb. İle eşleşir .

Önemli olan, dizinleri görmezden gelmemenizi sağlamaktır, çünkü o zaman o dizindeki her dosya diğer kurallardan bağımsız olarak yok sayılır.


0

Uzun süre aradım:

  1. Özyinelemeli olarak iç içe geçmiş ~ 100.000 dizine sahip büyük bir klasör yapısına sahip olduğumu varsayalım. Bu klasörlerde yaklaşık 30.000 dosya türü var .txt(benim durumumda: tür *.md). Bu *.mddosyaların yanında, diyelim ki izlemek istemediğim 500 GB (bir milyondan fazla) dosya var.

  2. Git'in yalnızca .txt(veya *.md) tüm klasörlerdeki ve alt dizinlerdeki dosyaları izlemesini istiyorum .

Doğru cevap şu olmalıdır: Git'te bu mümkün değildir.

Bunun yerine ne yaptım:

[düzenle: de işe yaramadı - Sembolik bağlantılar (veya sabit bağlantılar) içeren bir klasör oluşturmaya ve orada git kullanmaya çalıştım, ancak git sembolik bağları izlemiyor ve sabit bağlantıların üzerine yazıyor. Doh!]

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.