Berk Akademi
Ana Sayfa
ÖZEL KODLAMA DERSLERİ
Yazılım Özel Ders
Tüm birebir programlara genel bakış
Python Yazılım Kursu
Sıfırdan ileri seviyeye birebir Python
Java Yazılım Kursu
OOP odaklı birebir Java eğitimi
AP Computer Science Principles
AP CSP sınav hazırlığı
GRUP DERSLERİ
Python & Django Masterclass
SINIRLI KONTENJAN
Java & Spring Boot Masterclass
SINIRLI KONTENJAN
C# .NET Masterclass
SINIRLI KONTENJAN
VİDEO DERSLER
Sıfırdan Temel Python Kursu
Kendi Hızında Öğren
ÜCRETSİZ
Seviye Testi
Ücretsiz — Python, Java, algoritma seviye testleri
Kariyerini Keşfet
Sertifika Doğrula
Belge numarası ve soyad ile doğrulama

.gitignore Kuralları Neden Çalışmıyor? İzlenen Dosyayı Düzeltme Rehberi

gitignore-kurallari-neden-calismiyor-izlenen-dosyayi-duzeltme
Bu yazıda neler var?
  1. .gitignore İçindeki Dosya Neden Hâlâ Görünür?
  2. 1. Kontrol: .gitignore Doğru Konumda mı?
  3. 2. Kontrol: Desen Dosya Yoluyla Gerçekten Eşleşiyor mu?
  4. 3. Kontrol: Dosya Daha Önce Track Edildi mi?
  5. 4. Kontrol: Dosya Staged Durumda mı?
  6. 5. Kontrol: Son Doğrulama ve Geçmişteki Hassas Bilgiler
  7. Git'i Proje İş Akışında Öğrenirken Bu Hatanın Tekrarını Önlemek
  8. Sık Sorulan Sorular

.gitignore çalışmıyor gibi görünüyorsa sorun çoğu zaman kuralın kendisinden değil, Git’in dosyayı daha önce izlemeye başlamış olmasından kaynaklanır. Bir dosya zaten track ediliyorsa, sonradan `.gitignore` içine eklemek Git’in mevcut takibini kendiliğinden bırakmaz. Bunun yanında `.gitignore` dosyasının yanlış kökte bulunması, desenin gerçek dosya yoluyla eşleşmemesi veya dosyanın staged durumda kalması da dosyanın görünmesine neden olabilir.

Rastgele komutlar denemek yerine teşhisi beş kontrol noktasına ayırmak daha sağlıklıdır: konum ve kök dizin, desen yazımı, daha önce track edilme, staged değişiklikler ve son doğrulama. Özellikle `.env` gibi ortam değişkenlerini veya kimlik bilgilerini içerebilen dosyalar için amaç, dosyanın yeni değişikliklerinin izlenmesini önlemektir; bu işlem geçmişte paylaşılmış bilgilerin otomatik olarak güvende olduğu anlamına gelmez.

.gitignore İçindeki Dosya Neden Hâlâ Görünür?

`.gitignore`, Git’e belirli dosya ve klasörleri normal çalışma sırasında dikkate almamasını söyleyen bir kural dosyasıdır. Ancak bu dosya, daha önce Git tarafından izlenmeye başlanmış bir dosyanın takibini geriye dönük olarak kaldırmaz. Örneğin `.env` dosyanızı önce commit edip daha sonra `.gitignore` içine eklerseniz, dosya hâlâ git status çıktısında değişmiş olarak görünebilir.

Bu davranış aslında `.gitignore` dosyasının görev sınırından kaynaklanır. `.gitignore` yeni ve henüz izlenmeyen dosyaların Git tarafından otomatik olarak eklenmesini engeller. Daha önce index’e alınmış bir dosyanın takibini bırakmak için ayrıca Git index’i üzerinde işlem yapmak gerekir. Bu işlem ilerleyen kontrolde ele alınmalıdır; burada ilk amaç, dosyanın neden görünür olduğunu doğru sınıfa ayırmaktır.

Örneğin depo kökündeki bir `.env` dosyasını yok saymak için `.gitignore` içine şu kural yazılabilir:

/.env

Bu kural doğru yazılmış olsa bile `.env` daha önce git add ile eklenmiş veya commit edilmişse dosyanın görünür olması beklenebilir. Benzer şekilde `.gitignore` dosyası depo kökünde değil, ilgisiz bir alt klasördeyse yazdığınız kural hedef dosyaya ulaşmayabilir.

İlk teşhiste şu soruları sırayla sormak, problemi gereksiz komut kalabalığı olmadan daraltır:

Kontrol noktası Sorulacak soru Sorunu nasıl daraltır?
Konum ve kök dizin Komutu doğru Git deposu içinde mi çalıştırıyorum? `.gitignore` ve hedef dosyanın aynı depo yapısı içindeki yerini netleştirir.
Desen yazımı Yazdığım kural, dosyanın gerçek yoluyla eşleşiyor mu? Başlangıçtaki `/`, klasör sonundaki `/`, joker karakterler ve istisnalar kontrol edilir.
Daha önce track edilme Dosya daha önce index’e eklendi veya commit edildi mi? `.gitignore` kuralının neden mevcut takibi durdurmadığı anlaşılır.
Staged değişiklikler Dosyanın değişikliği zaten staged alana taşındı mı? Çalışma alanındaki kural değişikliği ile index’teki mevcut durum birbirinden ayrılır.
Son doğrulama Kural gerçekten dosyayı eşleştiriyor mu? git check-ignore ve git status çıktıları birlikte değerlendirilir.

Bu beş noktanın her biri farklı bir problemi gösterir. Örneğin yanlış konumdaki `.gitignore` için doğru bir desen yazmış olsanız bile sonuç alamazsınız. Tersine, `.gitignore` doğru yerde olsa da desen hedef dosyanın yolunu kapsamıyorsa Git dosyayı görünür tutar.

1. Kontrol: .gitignore Doğru Konumda mı?

1. Kontrol: .gitignore Doğru Konumda mı?

İlk adım, hangi Git deposu içinde çalıştığınızı ve depo kökünün nerede olduğunu bulmaktır. Terminalde aşağıdaki komutu çalıştırın:

git rev-parse --show-toplevel

Bu komutun amacı, içinde bulunduğunuz klasörün bağlı olduğu Git deposunun kök dizinini göstermektir. Örnek bir çıktı şöyle olabilir:

/Users/ayse/projeler/fatura-uygulamasi

Windows üzerinde çıktı biçimi sistem terminaline göre değişebilir; önemli olan gösterilen klasörün içinde depo için kullanılan .git yapısının bulunmasıdır. Bundan sonra hem `.gitignore` dosyasını hem de görünmesini istemediğiniz dosyayı bu köke göre düşünmelisiniz.

Örneğin depo yapınız şu şekilde olsun:

fatura-uygulamasi/
├── .gitignore
├── .env
├── src/
│   └── uygulama.py
└── config/
    └── .env

Bu yapıda kök dizindeki `.env` dosyasının yolu depo köküne göre .env olur. Yalnızca bu dosyayı hedeflemek istiyorsanız depo kökündeki `.gitignore` içinde şu kuralı kullanabilirsiniz:

/.env

Başlangıçtaki / işareti burada önemlidir. Deseni `.gitignore` dosyasının bulunduğu köke bağlar. Böylece kural, depo kökündeki `.env` dosyasını hedefler; config/.env gibi alt klasörlerde bulunan aynı adlı dosyaları otomatik olarak aynı kapsamda değerlendirmez.

Deponun herhangi bir alt klasöründe bulunan tüm `.env` dosyalarını kapsamak istiyorsanız daha geniş bir desen tercih edebilirsiniz:

**/.env

Bu desen, depo kökünden itibaren alt klasörlerde bulunan `.env` dosyalarını da hedeflemeyi amaçlar. Ancak geniş desen kullanmadan önce gerçekten hangi dosyaları yok saymak istediğinizi belirleyin. Bazı projelerde örnek yapılandırma dosyalarının Git’te tutulması istenebilir. Bu durumda tüm `.env` dosyalarını kapsayan bir kural yerine yalnızca belirli klasörü hedefleyen daha dar bir desen daha anlaşılır olabilir:

config/.env

Burada dikkat edilmesi gereken bir başka nokta, çalışma dizini ile depo kökünün aynı şey olmadığıdır. Örneğin src/ klasörünün içindeyken git rev-parse --show-toplevel komutu yine de depo kökünü gösterir. `.gitignore` kurallarını değerlendirirken dosya yollarını çoğunlukla bu köke göre düşünmek, yanlış klasöre kural ekleme riskini azaltır.

İç içe klasörlerde birden fazla `.gitignore` dosyası da bulunabilir. Depo kökündeki `.gitignore` genel kuralları belirlerken, alt klasördeki `.gitignore` o klasörün içindeki dosya ve klasörler için daha yerel kurallar sağlayabilir. Bu nedenle dosyanın yanında veya üst dizinlerinde başka bir `.gitignore` bulunup bulunmadığını da kontrol etmek gerekir.

Örneğin şu yapı farklı kapsamlar oluşturabilir:

fatura-uygulamasi/
├── .gitignore
├── src/
│   ├── .gitignore
│   └── debug.log
└── logs/
    └── debug.log

src/.gitignore içindeki bir kural doğrudan src/ altındaki dosyalarla ilişkili olabilir. Aynı desenin logs/debug.log için çalışacağını varsaymak doğru değildir. Önce dosyanın hangi klasörde olduğunu, sonra kuralın hangi `.gitignore` dosyasından uygulandığını belirleyin.

İlk kontrol için uygulanabilecek kısa sıra şöyledir:

  1. Terminalde hedef projenin içine girin.
  2. git rev-parse --show-toplevel ile depo kökünü bulun.
  3. Hedef dosyanın bu köke göre yolunu yazın.
  4. `.gitignore` dosyasının depo kökünde veya ilgili alt klasörde bulunup bulunmadığını kontrol edin.
  5. Kuralı, dosyanın gerçek yoluyla karşılaştırın.

Örneğin kök dizindeki `.env` için temel kontrol komutları şu şekilde olabilir:

git rev-parse --show-toplevel
pwd
ls -la .gitignore .env

Unix benzeri bir terminalde beklenen çıktı kabaca şu yapıda olur:

/Users/ayse/projeler/fatura-uygulamasi
/Users/ayse/projeler/fatura-uygulamasi
-rw-r--r--  1 ayse  staff  12  Aug 29 10:15 .env
-rw-r--r--  1 ayse  staff  24  Aug 29 10:16 .gitignore

Buradaki ls komutunun amacı dosyaların gerçekten bulunduğunuz klasörde olup olmadığını görmektir. Çıktı işletim sistemine ve terminale göre değişebilir; asıl kontrol edilmesi gereken nokta, `.gitignore` ile hedef dosyanın beklenen konumda bulunmasıdır.

`.env` dosyası genellikle yerel ortam değişkenleri, bağlantı ayarları veya erişim bilgileri içerebildiği için yanlışlıkla sürüm kontrolüne alınmaması istenebilir. Fakat yalnızca dosyayı `.gitignore` içine yazmak, daha önce commit edilmiş bilgilerin geçmişten kaldırıldığı veya bu bilgilerin artık kullanılamayacağı anlamına gelmez. Hassas bir değer daha önce paylaşıldıysa kimlik bilgilerinin yenilenmesi ve geçmiş temizliğinin ayrıca değerlendirilmesi gerekir.

2. Kontrol: Desen Dosya Yoluyla Gerçekten Eşleşiyor mu?

`.gitignore` doğru konumdaysa sıradaki soru, yazılan desenin hedef dosyanın gerçek yolunu kapsayıp kapsamadığıdır. Önce dosyanın depo köküne göre yolunu yazın; ardından en dar ve anlaşılır deseni seçin. Kuralı gereğinden geniş yazmak, takip etmek istediğiniz başka dosyaların da göz ardı edilmesine yol açabilir.

En sık kullanılan desen farkları şu örneklerle görülebilir:

  • /.env: yalnızca depo kökündeki `.env` dosyasını hedefler.
  • .env: kuralın bulunduğu kapsam içinde aynı adlı dosyaları hedefleyebilir.
  • **/.env: alt klasörlerde bulunan `.env` dosyalarını da kapsamak için kullanılır.
  • *.env: uzantısı .env olan dosyaları hedefler; örneğin local.env ve test.env.
  • logs/: adı logs olan dizinleri hedefler; tek başına aynı adlı normal bir dosyayı hedeflemek için kullanılmaz.
  • !config/example.env: daha önce eşleşen geniş bir kuralın içinden belirli bir dosyayı istisna olarak bırakabilir.

Örneğin hem tüm ortam dosyalarını yok sayıp hem de güvenli bir örnek dosyasını depoda tutmak isteyebilirsiniz:

**/*.env
!config/example.env

Bu örnekte *.env deseni dosya adının uzantı bölümünü hedefler. **/*.env ise aynı yaklaşımı alt klasörler boyunca genişletir. İstisna satırındaki ! işareti, daha önce yok sayılan eşleşmeler içinden belirtilen yolu yeniden görünür hâle getirmek için kullanılır. İstisnanın çalışması için üst klasörlerin de Git tarafından erişilebilir olması gerekir; bir klasör bütünüyle yok sayılmışsa yalnızca altındaki dosyayı istisna yapmak beklenen sonucu vermeyebilir.

Deseni kontrol ederken üç soruluk mini karar çerçevesi kullanın:

  1. Dosya yolu doğru mu? Hedef dosya gerçekten depo kökünde mi, yoksa config/, src/ veya başka bir alt klasörde mi?
  2. Desen kapsamı doğru mu? Başlangıçtaki / yalnızca kökü mü hedefliyor, sondaki / yalnızca klasör mü arıyor, joker karakter dosya adını gereğinden fazla mı genişletiyor?
  3. Daha öncelikli veya istisna bir kural var mı? Başka bir `.gitignore` dosyası, daha geniş bir desen ya da ! ile başlayan istisna sonucu değiştiriyor mu?

Git’in hangi kuralı kullandığını görmek için git check-ignore komutundan yararlanabilirsiniz. Depo kökündeki `.env` dosyası için şu komut teşhis amacıyla kullanılır:

git check-ignore -v --no-index .env

-v seçeneği eşleşen kuralın hangi dosyadan ve hangi satırdan geldiğini göstermeye yardımcı olur. --no-index ise dosyanın index’teki mevcut takip durumunu teşhis değerlendirmesinin dışında bırakır; böylece daha önce track edilmiş bir dosyanın çalışma ağacındaki `.gitignore` kuralıyla eşleşip eşleşmediğini inceleyebilirsiniz.

Kuralınız `.gitignore` dosyasının ilk satırındaysa örnek çıktı şu biçimde görünebilir:

.gitignore:1:/.env .env

Bu çıktı, `.env` dosyasının `.gitignore` dosyasındaki birinci satırda bulunan /.env deseniyle eşleştiğini gösterir. Çıktının tam biçimi Git sürümüne ve terminal ortamına göre farklı görünebilir; önemli bilgiler, kuralı içeren dosya, satır numarası ve eşleşen desendir.

Komut hiçbir çıktı üretmiyorsa bu genellikle hedef yol için eşleşen bir ignore kuralı bulunmadığını gösterir. Bunun olası nedenleri arasında yanlış dosya yolu, yanlış `.gitignore` konumu, desen kapsamının yetersiz olması veya istisna kuralı bulunması vardır. Dosya tracked durumdaysa normal git check-ignore kullanımı da sonuç vermeyebilir; bu nedenle burada --no-index seçeneği özellikle önemlidir.

Örneğin hedef dosya config/.env ise kök dizinde yalnızca şu kuralın bulunması:

/.env

config/.env dosyasını eşleştirmeyebilir. Bu durumda ihtiyaca göre config/.env veya **/.env gibi bir desen değerlendirilmelidir. Buna karşılık *.env kullanmak, projenin farklı klasörlerinde bulunan birden fazla ortam dosyasını da kapsayabilir. En iyi seçim, hedeflediğiniz dosyaların tamamını ve yalnızca onları kapsayan desendir.

Kuralları daha sistemli incelemek, özellikle dosya yolu ve desen mantığının karıştırıldığı projelerde zaman kazandırır. Bu tür Git hata ayıklama yaklaşımını farklı yazılım geliştirme konularıyla birlikte görmek isteyenler, Git ve yazılım geliştirme yazıları arasında ilgili örnekleri inceleyebilir.

Son olarak, git check-ignore -v --no-index yalnızca ignore kuralının eşleşmesi hakkında kanıt sağlar. Dosyanın daha önce commit edilip edilmediğini, staged durumda bulunup bulunmadığını veya geçmişte hassas bir bilgi içerip içermediğini tek başına kanıtlamaz. Bu nedenle çıktıyı, sonraki kontrollerde Git’in index ve çalışma alanı durumunu gösteren komutlarla birlikte değerlendirmek gerekir.

3. Kontrol: Dosya Daha Önce Track Edildi mi?

.gitignore yalnızca Git’in henüz izlemeye almadığı dosyaların gelecekte otomatik olarak eklenmesini engeller. Bir dosya daha önce git add ile index’e alındıysa veya bir commit içinde yer aldıysa, sonradan .gitignore dosyasına eklenmesi mevcut takibi kendiliğinden kaldırmaz.

Bunun nedeni Git’in dosyayı iki farklı açıdan değerlendirmesidir: Çalışma klasöründeki dosya ve repository’nin index’inde bulunan dosya. .gitignore kuralı yeni ve izlenmeyen dosyalar için devreye girer; hâlihazırda izlenen bir dosyanın takibini geriye dönük olarak otomatik biçimde silmez. Bu nedenle git status çıktısında dosyanın hâlâ değişmiş veya staged durumda görünmesi beklenebilir.

Bu durum özellikle .env dosyalarında sık görülür. Geliştirme sırasında dosya yanlışlıkla git add . komutuyla index’e alınmış olabilir. Daha sonra güvenlik amacıyla .gitignore içine .env yazılsa bile Git, daha önce tanıdığı dosyayı izlemeye devam eder.

.env Dosyasını İzlemeden Çıkarmanın Güvenli Akışı

Amaç çalışma klasöründeki .env dosyasını silmek değil, Git’in index’inde tutulan kopyanın takibini bırakmaktır. Bunun için aşağıdaki sırayı izleyin:

  1. Kuralı ekleyin: Projenin kökündeki .gitignore dosyasına ayrı bir satır olarak .env yazın.

  2. Dosyanın yolunu kontrol edin: Gerçek dosyanın proje kökünde .env olarak bulunduğundan emin olun. Dosya config/.env veya settings/.env gibi başka bir konumdaysa komutta ilgili yolu kullanmanız gerekir.

  3. Yalnızca index’ten çıkarın: git rm --cached -- .env komutunu çalıştırın.

  4. Durumu inceleyin: git status veya kısa çıktı için git status --short kullanın.

  5. Sonraki commit’i kontrol edin: Beklenen değişiklik, .env dosyasının repository’den çıkarılmasının staged hâle gelmesi ve çalışma klasöründeki dosyanın yerinde kalmasıdır.

--cached seçeneği burada belirleyicidir. Git’in git-rm belgeleri bu seçeneğin dosyayı yalnızca index’ten kaldırdığını, çalışma ağacındaki dosyayı ise bıraktığını açıklar. Bu nedenle git rm --cached -- .env komutu, normal git rm komutundan farklı olarak yerel .env dosyanızın içeriğini silmez.

Yine de komutu çalıştırmadan önce hedef yolu kontrol etmek önemlidir. Örneğin git rm --cached -- config/.env ile git rm --cached -- .env aynı dosyayı hedeflemez. Yanlış yolu yazmak komutun beklediğiniz dosya üzerinde işlem yapmamasına, geniş bir yol deseni kullanmak ise istemediğiniz dosyaların index’ten çıkarılmasına neden olabilir.

Çalışma Ağacındaki İçerik Korunur mu?

Normal koşullarda evet. --cached kullanıldığında Git, dosyanın çalışma klasöründeki kopyasını bırakır. Yerel .env dosyanızda veritabanı adresi, API anahtarı veya geliştirme ortamına özel başka değerler varsa bu içerik bilgisayarınızdaki dosyada kalır.

Ancak komut, dosyanın index’teki durumu ile çalışma klasöründeki durumu arasında uyumsuzluk varsa durumu incelemenizi isteyebilir. Özellikle dosyada daha önce staged edilmiş değişiklikler bulunuyorsa, rastgele -f kullanmak yerine önce git status --short ve gerekirse staged farklarını incelemek daha güvenlidir.

Git’i yalnızca dosya ekleyip commit etmekten ibaret görmemek, bu tür hataların neden oluştuğunu anlamayı kolaylaştırır. Proje klasöründe Git, branch ve değişiklik takibini gerçek bir iş akışı içinde öğrenmek isteyenler için canlı sınıflı yazılım eğitimleri içinde bu bağlantılar uygulamalı olarak ele alınabilir; burada amaç ayrı bir Git eğitimi sunmak değil, yazılım geliştirmenin günlük araçlarını doğru kullanmaktır.

4. Kontrol: Dosya Staged Durumda mı?

4. Kontrol: Dosya Staged Durumda mı?

.gitignore kuralını ekledikten sonra dosyanın hâlâ görünmesinin bir başka nedeni, dosyanın index’e alınmış değişikliklerle birlikte staged durumda bulunmasıdır. Bu noktada yalnızca dosyanın ignore edilip edilmediğine değil, Git’in dosyayı commit için hazırlanan alanda nasıl gördüğüne de bakmak gerekir.

Teşhis için en pratik komut git status --short komutudur. Kısa formatta iki karakterlik durum kodu kullanılır:

  • İlk karakter, index’teki yani staged alandaki durumu gösterir.
  • İkinci karakter, çalışma klasörü ile index arasındaki durumu gösterir.
  • A, yeni eklenmiş bir dosyayı ifade eder.
  • M, değiştirilmiş bir dosyayı ifade eder.
  • D, silinmiş veya Git açısından silinmek üzere işaretlenmiş bir dosyayı ifade eder.
  • ??, henüz izlenmeyen ve staged olmayan bir dosyayı gösterir.

Örneğin D  .env çıktısında ilk karakterdeki D, .env dosyasının index’ten kaldırılmak üzere staged edildiğini anlatır. Bu, düzeltme akışında beklenen bir sonuç olabilir. Dosya çalışma klasöründe kaldığı için Git’in ikinci durum karakterinde ayrıca bir M veya ?? görmeyebilirsiniz; çünkü dosya artık ignore edilmektedir.

.env İçin Mini Teşhis Akışı

Aşağıdaki örnekte her komut, sorunu farklı bir açıdan daraltır. İlk komut kuralı ekler, ikinci komut daha önce track edilmiş dosyayı index’ten çıkarır, üçüncü komut staged durumu gösterir, son komut ise dosya yolu ile ignore kuralı arasındaki eşleşmeyi inceler.

printf ' .env ' >> .gitignore
git rm --cached -- .env
git status --short
git check-ignore -v --no-index .env

Örnek bir terminal çıktısı şu şekilde olabilir:

rm '.env'
 M .gitignore
D  .env
.gitignore:2:.env	.env

Bu çıktıyı satır satır okuyalım:

  • rm '.env', dosyanın Git index’inden çıkarıldığını gösterir. --cached kullanıldığı için çalışma klasöründeki dosya silinmez.
  •  M .gitignore, .gitignore dosyasının çalışma klasöründe değiştiğini, fakat henüz staged edilmediğini gösterir. Başındaki boşluk, değişikliğin ikinci sütunda olduğunu belirtir.
  • D  .env, .env dosyasının index’ten kaldırılmasının staged hâle geldiğini gösterir. Bu işlem, dosyanın bir sonraki commit’te repository’den çıkarılmasına hazırlanır.
  • .gitignore:2:.env  .env, ikinci satırdaki .env kuralının hedef dosyayla eşleştiğini gösterir.

Buradaki örnek çıktı her repository’de birebir aynı olmak zorunda değildir. Dosyanın daha önce commit edilip edilmediği, .gitignore dosyasının daha önce staged edilip edilmediği, dosyanın değiştirilmiş olup olmadığı ve kullanılan işletim sisteminin terminal biçimi çıktıyı etkileyebilir.

Örneğin .gitignore daha önce staged edilmişse git status --short çıktısında M  .gitignore görebilirsiniz. Bu kez değişikliğin ilk sütunda yer alması, ignore kuralının index’e de alındığı anlamına gelir. .env dosyası yalnızca daha önce git add ile eklenmiş, ancak hiç commit edilmemişse durum kodu yine farklı görünebilir. Önemli olan harfleri ezberlemek değil, iki sütunun hangi alanı anlattığını bilmektir.

Her Komutun Sorunu Nasıl Daralttığı

  1. printf ' .env ' >> .gitignore komutu, test edilen dosya için gerçekten bir ignore kuralı bulunduğunu garanti etmeye yardımcı olur. Dosyada aynı kural zaten varsa tekrar satır eklemek yerine dosyayı elle kontrol etmek daha temizdir.

  2. git rm --cached -- .env komutu, sorunun “kural yok” değil “dosya daha önce izlenmiş” olma ihtimalini test eder ve dosyayı yalnızca index’ten çıkarır.

  3. git status --short komutu, yapılan işlemin staged alana ve çalışma klasörüne nasıl yansıdığını gösterir.

  4. git check-ignore -v --no-index .env komutu, Git’in index durumunu hesaba katmadan .env yolunun bir ignore kuralıyla eşleşip eşleşmediğini kontrol eder.

git check-ignore komutu varsayılan davranışta track edilen dosyalar için çıktı vermeyebilir. Bunun nedeni, track edilen dosyaların normal ignore değerlendirmesinde gösterilmemesidir. --no-index seçeneği, dosyanın index’te kayıtlı olup olmadığını bu kontrolün dışında bırakır ve kural eşleşmesini ayrıca incelemenizi sağlar.

5. Kontrol: Son Doğrulama ve Geçmişteki Hassas Bilgiler

Düzeltme tamamlandıktan sonra üç ayrı şeyi doğrulamalısınız: .gitignore kuralı gerçekten eşleşiyor mu, git status dosyayı beklenen biçimde gösteriyor mu ve .env dosyası çalışma klasöründe hâlâ duruyor mu?

İlk kontrol için şu komut kullanılabilir:

git check-ignore -v --no-index .env

Komut bir çıktı verirse, çıktıdaki kaynak dosya, satır numarası, desen ve dosya yolu birlikte okunmalıdır. Örneğin .gitignore:2:.env  .env sonucu, .gitignore dosyasının ikinci satırındaki .env deseninin mevcut .env yoluyla eşleştiğini gösterir. Sonuç boşsa desen yanlış yazılmış, dosya farklı bir konumda bulunuyor veya başka bir ignore kuralı değerlendirmeyi etkiliyor olabilir.

Bu komutun kanıtladığı şey sınırlıdır: Yalnızca verdiğiniz mevcut yol ile Git’in değerlendirdiği ignore kuralları arasında bir eşleşme olduğunu gösterir. git check-ignore sonucu; dosyanın geçmiş commit’lerden silindiğini, dosya içeriğinin güvenli hâle geldiğini veya başka bir bilgisayarda, branch’te ya da uzak repository kopyasında aynı bilginin bulunmadığını kanıtlamaz. Git’in git-check-ignore belgeleri de -v ile eşleşen kuralın kaynağı ve satır bilgisinin gösterilebildiğini, --no-index seçeneğinin ise index değerlendirmesini devre dışı bıraktığını belirtir.

git status Çıktısında Ne Beklenir?

git rm --cached -- .env sonrasında git status --short çıktısında genellikle .env için staged bir silme durumu görürsünüz. Bu, çalışma klasöründeki dosyanın silindiği anlamına gelmez. Git açısından dosyanın index’teki kaydı kaldırılmak üzere hazırlanmıştır; yerel dosya ise ignore edildiği için yeni ve izlenmeyen dosya olarak ayrıca listelenmeyebilir.

git status çıktısında .env dosyasının beklenmeyen şekilde M, A veya ?? olarak görünmesi durumunda yol, desen ve index durumu yeniden kontrol edilmelidir. Özellikle config/.env için yalnızca .env kuralı yazmak ile kökteki .env dosyasını eşleştirmek aynı şey değildir; dosyanın bulunduğu konuma uygun desen kullanılmalıdır.

Dosya Çalışma Klasöründe Duruyor mu?

Son kontrol, dosyanın gerçekten bilgisayarınızdaki proje klasöründe bulunduğunu doğrulamaktır. Dosya yöneticisinden veya terminalden kontrol edebilirsiniz:

test -f .env && echo ".env çalışma klasöründe mevcut"
git status --short

İlk satır mesaj veriyorsa yerel dosya hâlâ vardır. İkinci satırda .env görünmüyorsa ve git check-ignore -v --no-index .env eşleşen kuralı gösteriyorsa, temel düzeltme tamamlanmış demektir. Ancak bu sonuç, dosyanın içindeki değerlerin güvenli olduğu anlamına gelmez.

Daha Önce Commit Edilmiş Hassas Bilgiler İçin Ayrı Değerlendirme

.env dosyası daha önce bir commit’e girdiyse, yalnızca git rm --cached -- .env çalıştırmak geçmişteki commit’leri temizlemez. Bu komut dosyanın gelecekteki takibini bırakmaya yardımcı olur; önceki commit’lerde yer alan içerik ise repository geçmişinde, başka branch’lerde, uzak kopyalarda veya klonlanmış çalışma klasörlerinde bulunabilir.

Dosyada API anahtarı, veritabanı parolası, özel erişim belirteci veya benzeri bir kimlik bilgisi bulunduysa bunu yalnızca “dosyayı ignore ettim” diyerek çözülmüş kabul etmeyin. İlgili kimlik bilgilerinin yenilenmesi, iptal edilmesi veya yeniden oluşturulması ayrı bir güvenlik adımıdır. Gerekli durumlarda geçmiş temizleme süreci de ayrıca değerlendirilmelidir; bu işlem ekipteki diğer geliştiricilerin klonlarını, uzak repository’leri ve dağıtılmış kopyaları etkileyebileceği için gelişigüzel uygulanmamalıdır.

Bu nedenle git check-ignore ile alınan başarılı sonuç, güvenlik garantisi değil, yalnızca bundan sonraki ignore davranışı için teknik bir doğrulamadır. Hassas verinin geçmişte paylaşılmış olabileceğinden şüpheleniyorsanız erişim sağlayıcısının kayıtlarını ve ilgili kimlik bilgilerinin kullanım durumunu da inceleyin.

Beş Maddelik Son Kontrol Listesi

  1. .gitignore içinde dosyanın gerçek yoluyla eşleşen kuralın bulunduğunu doğrulayın.
  2. git rm --cached -- .env komutunun doğru hedef dosyada çalıştırıldığından emin olun.
  3. git status --short çıktısında staged silme durumunu ve .gitignore değişikliğini bilinçli biçimde inceleyin.
  4. git check-ignore -v --no-index .env ile eşleşen kuralın dosya ve satır bilgisini kontrol edin.
  5. .env dosyasının çalışma klasöründe kaldığını, fakat gelecekte Git tarafından izlenmediğini ayrıca doğrulayın.

Bu beş kontrol, “.gitignore çalışmıyor” gibi görünen durumları rastgele komut denemeden ayırmanızı sağlar: önce kuralın eşleşmesi, sonra dosyanın geçmişte track edilip edilmediği, ardından staged durum ve son olarak hassas bilgilerin geçmişteki yayılımı incelenir.

Git'i Proje İş Akışında Öğrenirken Bu Hatanın Tekrarını Önlemek

.gitignore sorunlarını yalnızca hata çıktığında çözmeye çalışmak yerine, proje başlangıcından itibaren dosyaların sorumluluğunu netleştirmek daha sağlıklı bir iş akışı oluşturur. Her yeni dosyada kısa bir soru sormak yeterlidir: “Bu dosya ekip tarafından paylaşılmalı mı, yoksa yalnızca benim bilgisayarımda mı kalmalı?”

Projenin başında .gitignore dosyasını oluşturun

Bir projeye başlarken .gitignore dosyasını sonradan eklemek yerine ilk dosyalarla birlikte oluşturmak, yanlışlıkla izlenen dosya riskini azaltır. Dosyanın içinde kullanılan teknolojiye ve çalışma ortamına göre yerel ayarlar, geçici dosyalar, derleme çıktıları ve gizli yapılandırma dosyaları ayrı tutulabilir.

Örneğin bir uygulamada .env dosyası kişisel API anahtarları, veritabanı bağlantı bilgileri veya uygulamaya özel ayarlar içeriyorsa bu dosya genellikle depoya gönderilmemelidir. Ancak ekip arkadaşlarının hangi değişkenleri tanımlaması gerektiğini anlayabilmesi için gerçek sırları içermeyen bir örnek dosya paylaşılabilir:

APP_PORT=3000
DATABASE_URL=your-local-database-url
API_KEY=your-api-key

Bu dosyanın adı ekip kararına göre .env.example veya benzeri bir biçimde belirlenebilir. Önemli nokta, örnek dosyanın çalışmaya yardımcı olması; gerçek parola, token, özel anahtar veya kişisel erişim bilgisini barındırmamasıdır.

Örnek yapılandırma ile gerçek sırları birbirinden ayırın

Gerçek .env dosyasını yerel ortamda tutmak, örnek yapılandırma dosyasını ise projeyle paylaşmak, ekip içindeki belirsizliği azaltır. Böylece yeni bir geliştirici hangi değişkenlerin gerekli olduğunu görür; fakat çalışan ortama ait gerçek değerler Git deposuna girmez.

  • .env: Yerel makinede kalması gereken gerçek değerleri içerir.
  • .env.example: Değişken adlarını ve örnek biçimleri gösterir, gerçek sırları içermez.
  • Proje dokümantasyonu: Değişkenlerin ne işe yaradığını ve nasıl oluşturulacağını açıklar.
  • Paylaşılan yapılandırma: Ekipçe kullanılmasına karar verilen, gizli olmayan varsayılanları barındırır.

Burada dosya adlandırma kurallarının ekip içinde önceden kararlaştırılması da önemlidir. Bir geliştirici .env kullanırken diğerinin local.env, development.env veya config.local kullanması, mevcut ignore kurallarının etkisiz kalmasına neden olabilir. Ekip, yerel yapılandırma dosyalarının adlarını ve hangi dosyaların depoya eklenebileceğini kısa bir dokümanda açıkça belirtmelidir.

Her commit öncesinde dosyanın rolünü kontrol edin

Commit öncesinde git status çıktısına bakmak basit ama güçlü bir alışkanlıktır. Amaç yalnızca hata aramak değildir; yaptığınız değişikliklerin proje açısından doğru yerde durduğunu anlamaktır.

  1. Yeni eklenen dosyaları inceleyin.
  2. Değişen dosyaların gerçekten commit kapsamına girip girmediğini değerlendirin.
  3. Yerel ayar, parola, token veya kişisel makine bilgisi içeren dosyaları özellikle kontrol edin.
  4. Dosya adının ekip standardına uygun olup olmadığını doğrulayın.
  5. Ancak içerik ve kapsam beklediğiniz gibiyse commit işlemine geçin.

Bu kontrol, .gitignore dosyasına körü körüne güvenmekten daha güvenlidir. Çünkü ignore kuralı doğru yazılmış olsa bile dosya daha önce izlenmiş, yanlış klasöre eklenmiş veya staged alana alınmış olabilir. git status size o andaki çalışma ağacının durumunu gösterir; son kararı vermeden önce bu durumu yorumlamak gerekir.

Komutları tek başına değil, proje akışı içinde öğrenin

git add, git commit, git status ve git rm --cached gibi komutları ezberlemek başlangıç için yararlı olsa da kalıcı öğrenme, bu komutların hangi problemde devreye girdiğini anlamakla oluşur. Örneğin git rm --cached yalnızca izlemeyi bırakma ihtiyacı doğduğunda anlam kazanır; her Git sorununda çalıştırılması gereken genel bir düzeltme komutu değildir.

Bu nedenle öğrencinin her değişiklikte dosyanın yaşam döngüsünü düşünmesi gerekir: Dosya oluşturuldu, değiştirildi, izlemeye alındı mı, staged alana taşındı mı ve ekip arkadaşlarıyla paylaşılması gerekiyor mu? Bu sorular, komutları rastgele denemek yerine neden-sonuç ilişkisiyle kullanmayı sağlar.

Canlı sınıflı veya video yazılım eğitimlerinde ders kayıtlarını tekrar izlemek de bu akışı pekiştirebilir. Özellikle bir projenin dosya oluşturma, değişiklik yapma, kontrol etme ve commit hazırlama aşamalarını yeniden görmek, Git komutlarının tek tek ne yaptığından çok gerçek proje sürecindeki yerini kavramaya yardımcı olur. Benzer konularda farklı senaryoları incelemek isteyenler, Git ve yazılım geliştirme yazılarına göz atarak kendi çalışma düzenlerine uygun kontrol alışkanlıkları geliştirebilir.

Sonuç olarak iyi bir Git alışkanlığı, yalnızca sorun çıktığında .gitignore dosyasını düzeltmekten ibaret değildir. Proje başında dosya rollerini belirlemek, gerçek sırları yerelde tutmak, örnek yapılandırmayı paylaşmak, ekip adlandırma kurallarını netleştirmek ve commit öncesinde değişiklikleri sakin biçimde gözden geçirmek, benzer hataların tekrarını önemli ölçüde azaltır.

Sık Sorulan Sorular

.gitignore dosyasına eklediğim .env neden git status çıktısında görünmeye devam ediyor?

.env dosyası daha önce Git tarafından izlemeye alındıysa, sonradan .gitignore dosyasına eklenmesi mevcut takibi kendiliğinden durdurmaz. Ayrıca kuralın doğru proje kökünde olup olmadığını, desenin dosya yoluyla eşleşip eşleşmediğini ve dosyanın staged alanda bulunup bulunmadığını kontrol etmek gerekir. Bu kontrollerden sonra dosyanın izlemeyi bırakma işlemi ayrıca yapılabilir.

git rm --cached .env komutu bilgisayarımdaki .env dosyasını siler mi?

Bu komut, dosyanın çalışma klasöründeki kopyasını silmek yerine Git'in izleme alanından çıkarmayı amaçlar. Komuttan sonra dosya bilgisayarınızda kalır; doğru .gitignore kuralı varsa sonraki durum kontrollerinde izlenmeyen dosya olarak da gösterilmeyebilir. Yine de komutu çalıştırmadan önce doğru klasörde olduğunuzu ve silmek istemediğiniz başka bir dosyayı hedeflemediğinizi kontrol etmelisiniz.

git check-ignore komutu neden hiçbir çıktı vermiyor?

Bu komut genellikle verilen dosya yolunun mevcut ignore kuralları tarafından hariç bırakılıp bırakılmadığını incelemek için kullanılır. Hiç çıktı alınmaması, yazılan yolun eşleşmediğini gösterebilir; ancak dosyanın zaten izlenen bir dosya olması, komutun yanlış klasörde çalıştırılması, desenin farklı bir dizin yapısına göre yazılması veya komut kullanımının beklenen yolu hedeflememesi de sonucu etkileyebilir.

Bu nedenle git check-ignore tek başına bütün Git durumunu kanıtlayan bir araç olarak görülmemelidir. Proje kökü, dosyanın mevcut yolu, .gitignore içeriği ve git status çıktısı birlikte değerlendirilmelidir.

Daha önce commit edilmiş bir .env dosyası nasıl ele alınmalıdır?

Öncelikle gelecekteki takibi durdurmak için uygun .gitignore kuralı eklenmeli ve dosya çalışma klasöründe korunarak Git'in izleme alanından çıkarılmalıdır. Ancak bu işlem dosyayı geçmiş commit'lerden silmez. Dosyada parola, API anahtarı, erişim token'ı veya başka bir hassas bilgi yer aldıysa ilgili kimlik bilgilerinin yenilenmesi ya da iptal edilmesi geciktirilmemelidir.

Geçmiş commit'lerdeki hassas verilerin temizlenmesi ise ayrı bir geçmiş düzenleme sürecidir. Bu süreç ekipteki diğer klonları, açık pull request'leri ve yedekleri etkileyebileceğinden dikkatli planlanmalıdır. Geçmiş temizlense bile daha önce paylaşılmış bir sırrın kesin olarak hiç görülmediği varsayılmamalıdır.

.gitignore kuralının doğru çalıştığını nasıl kesin olmadan, güvenli biçimde doğrularım?

Önce kuralın doğru proje kökünde bulunduğunu ve dosya yoluyla eşleştiğini kontrol edin. Ardından dosyanın daha önce izlenip izlenmediğini değerlendirin, staged değişiklikleri inceleyin ve git status çıktısını tekrar okuyun. Uygun durumda git check-ignore ile dosyanın hangi ignore kuralıyla eşleştiğini araştırabilirsiniz.

Bu kontroller birlikte olumlu sonuç verse bile güvenliği yalnızca .gitignore dosyasına emanet etmeyin. Gerçek sırları örnek dosyalardan ayırın, commit öncesi dosya listesini inceleyin ve hassas bilgi yanlışlıkla paylaşılmışsa kimlik yenileme ile geçmiş temizliğini ayrıca değerlendirin.

Dosyaların izlenme durumunu anlamak, zamanla komut ezberinden daha değerli bir beceriye dönüşür: Her değişiklikte neyin paylaşılacağına bilinçli karar vermek, güvenli ve düzenli bir Git iş akışının temelidir.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin — Yazılım Geliştirici ve Eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; bugün öğrencinin seviyesine ve hedefine göre şekillenen sürdürülebilir öğrenme sistemleri tasarlıyor. 500'den fazla kişiye ezber değil, düşünerek kod yazmayı öğretti — Berk Akademi'de izlemeye değil üretmeye dayalı öğrenme kültürünü o kuruyor.

WhatsApp Hemen Ara