Git'i bir projede başlattığımızda (git init) ve git add . komutunu çalıştırdığımızda varsayılan olarak o dizindeki tüm dosyaları takip sürecine dahil eder. Bunlar arasında hiç değişmeyen görsel, video gibi dosyalardan tutun IDE'nin veya işletim sisteminin ürettiği geçici dosyalara kadar dahil edilmek istenmeyenler de dahil edilir. Çok özel bir durum yoksa bunların dosya takip sistemine dahil edilmesi faydadan çok zararı vardır.
Kısaca .gitignore dosyası Git'e "görmezden gel, takip etme" dediğimiz dosyaları/klasörleri yazdığımız bir kural dosyasıdır.
İşte bu noktada .gitignore dosyası devreye girer. Versiyonlanmaya dahil edilmek istenmeyen dosyalar/klasörler burada belirtilir. .gitignore gizli bir dosyadır. Bence bu iyi çünkü üzerinde çok sık değişiklik yapılan bir dosya değildir.
Bir .gitignore Dosyasının İçeriği Nasıl Olmalıdır?
İgnore edeceğimiz dosyaları birkaç başlık altında gruplayabiliriz.
- İşletim Sistemi Dosyaları: DS_Store (mac) veya Thumbs.db (windows) gibi dosyalar gereksiz olmanın yanında çakışmalara da sebebiyet verir. Gereksiz "merge conflict" üretir.
- IDE'ye Özgü Dosyalar: Örneğin JetBrains IDE'leri .idea, Visual Studio .vs, VS Code .vscode gibi kendilerine özel klasörler oluşturur. Bunları takipten çıkarabiliriz.
- Dile ve Platforma Özgü Dosyalar: node_modules veya bin/ gibi bağımlılık veya derlenmiş çıktı klasörleri projemizi gereksiz yere şişirir. Bu dosyalar gerekli ama yine de repoya dahil edilmez. Geliştiriciler çözüm olarak package.json gibi dosyalar aracılığıyla (npm install vb. komutlarla) bu bağımlılıkları kendi bilgisayarına indirir.
- Parola ve Key Dosyaları (GÜVENLİK): API anahtarları, veritabanı şifreleri veya gizli kalması gereken yapılandırma ayarlarımız (örn: .env dosyası) yanlışlıkla GitHub/GitLab gibi açık kaynaklı platformlara yüklenebilir. Buradaki projeler private olsa bile yine de güvenlik riski taşıdığını unutmamalıyız.
Bu dosyanın içeriği kullandığımız teknolojilere (php, .net, js gibi), işletim sistemine ve IDE'ye göre değişir. Ancak bu dosyaları Git'e belirtme şeklimiz yani syntax kurallarımız hep aynı ve sadedir. Aşağıda tüm .gitignore ifadelerini okuyabilirsiniz.
- # (Yorum Satırı): Satırın başına diyez işareti koyduğunuzda Git bu satırı okumaz. Kendinize veya ekibinize notlar bırakmak, kuralları kategorize etmek için kullanılır. Örn:
# İşletim Sistemi Dosyaları - * (Joker Karakter - Wildcard): Sıfır veya daha fazla karakteri temsil eder. Belirli bir uzantıya veya isme sahip tüm dosyaları gruplamak için harikadır. Örn:
*.log(Sonu .log ile biten tüm dosyaları yok sayar). - / Sonda (Klasör Belirtme): Sadece belirli bir klasörü ve içindeki her şeyi hedeflemek için kullanılır. Normal bir dosya ile aynı ismi taşıyan klasörleri ayırt etmeyi sağlar. Örn:
build/veyanode_modules/ - / Başta (Kök Dizin Belirtme): Kuralı sadece
.gitignoredosyasının bulunduğu ana dizin ile sınırlar, alt klasörlerdeki aynı isimli dosyaları engellemez. Örn:/todo.txt(Ana dizindeki todo.txt engellenir amasrc/todo.txtengellenmez). - ! (İstisna Belirtme): Engellenen genel bir kuralın içinden belirli bir dosyayı "hariç tutmak" (yani takibe almaya devam etmek) için kullanılır. Örn: Önce
*.logyazıp alt satıra!server.logyazarsanız, server.log hariç tüm log dosyaları engellenir. - ** (Derin Klasör Araması): Herhangi bir derinlikteki iç içe geçmiş klasörleri eşleştirmek için kullanılır. Örn:
logs/**/*.log(logs klasörünün altında kaç tane alt klasör olursa olsun içlerindeki tüm .log dosyalarını bulup yok sayar). - ? (Tek Karakter Jokeri): Sadece tek bir karakterin yerini tutar. Örn:
dosya?.txt(dosya1.txt veya dosyaA.txt engellenir ama dosya12.txt engellenmez). - [] (Karakter Aralığı): Belirli karakterleri veya sayı aralıklarını eşleştirmek için kullanılır. Örn:
temp[0-9].log(temp1.log'dan temp9.log'a kadar olanları engeller). - \ (Kaçış Karakteri): Dosya adının içinde gerçekten *, !, veya # gibi kural bildiren özel bir karakter varsa, Git'in kafasının karışmaması için kullanılır. Örn:
\#notlar.txt(İsmi gerçekten "#notlar.txt" olan dosyayı engeller).
Örnek .gitignore Dosyası
Engellenecek dosyalar dile, işletim sistemine ve kullandığımız editör/IDE'ye göre değişiklik gösterecektir.
Örneğin JetBrains ürünleri için .idea klasörü gibi. Peki neden takipten çıkartırız? Aynı projeyi farklı bir IDE'den açtığımızda IDE'ye özgü dosyalar oluşabilir. Bu dosyayı commit yapmamız hem bizim hem takım arkadaşlarımızın işine yaramaz. Hatta karışıklık bile çıkartabilir. İşte bu ve bunun gibi durumları göz önünde bulundurarak bu gizli git dosyasını oluşturmamız gerekir.
# İşletim Sistemi
.DS_Store
Thumbs.db
# IDE
.idea/
.vscode/
.vs/
# .NET
bin/
obj/
*.user
# Ortam değişkenleri
.env
*.env.local
İpucu: gitignore.io sitesinde dil, platform, IDE, işletim sistemi gibi bilgilerimizi seçerek sağlam bir engellenenler listesi elde edebiliriz.
.gitignore Dosyası Nasıl Oluşturulur?
Bu dosyayı projemize dahil etmek oldukça basittir. IDE'de sağ tıklayıp yeni dosya oluşturabileceğimiz gibi, terminal üzerinden çok daha hızlı bir şekilde oluşturabiliriz. Projemizin ana dizinindeyken terminale (veya komut satırına) aşağıdaki komutu yazmak yeterlidir:
touch .gitignore
Not: Windows kullanıyorsanız ve terminalde touch komutu çalışmıyorsa, alternatif olarak echo. > .gitignore yazılabilir.
Kısaca Git Ignore nedir? diye sorarsanız...
Basit bir metin dosyası gibi görünse de .gitignore; projelerimizin güvenliğini sağlayan, depo (repository) boyutunu temiz tutan ve ekip içi gereksiz çakışmaları önleyen bir dosyadır. Yeni bir projeye başlarken, ilk git commit komutunu çalıştırmadan önce mutlaka sağlam bir .gitignore dosyası oluşturmayı alışkanlık haline getirmenizi öneririz.
Çakışmasız kodlamalar dilerim.