- Git'in dosya yok sayma kuralları, paylaşım kapsamına göre
.gitignore, .git/info/exclude, ~/.config/git/ignore olmak üzere üç seviyeye ayrılır
.gitignore, depo koduyla birlikte commit edildiği için ekip ya da projenin birlikte uygulaması gereken paylaşılan kurallar için kullanılır
- Kişisel dosyalar veya yerel çalışma dosyaları gibi depoda bulunması gerekmeyen ama ekip kuralı yapmak için de uygun olmayan öğeleri
.git/info/exclude içine koymak daha uygundur
- macOS'taki
.DS_Store gibi tüm depolarda tekrar tekrar hariç tutulacak dosyalar, makine genelindeki ignore dosyası olan ~/.config/git/ignore içine eklenebilir
git check-ignore -v <dosya_adı>, bir dosyanın hangi kuralla yok sayıldığını izlemek için kullanışlıdır; eşleşen bir kural yoksa çıktı vermez
Git ignore kurallarının uygulandığı yerler
- Git, dosya yok sayma kurallarını üç konumda işleyebilir
.gitignore
.git/info/exclude
~/.config/git/ignore
.gitignore: depoya commit edilen paylaşılan kurallar
.gitignore, yok sayılacak dosya adlarının yazıldığı yaygın dosyadır
- Diğer kodlarla birlikte Git'e check-in edilir
.gitignore kurallarıyla eşleşen dosyalar, git komutları çalıştırılırken dikkate alınmaz
.git/info/exclude: depoya özel kişisel kurallar
exclude dosyası, her Git deposunun .git dizini içinde bulunur
- Bu dosyadaki değişiklikler Git'e check-in edilmez
- Yeni Git depolarında genellikle birkaç satır yorum bulunur
- Yalnızca o depoda yok saymak istediğiniz ama
.gitignore içine koymak istemediğiniz dosyalar için uygundur
- Örnek: Yalnızca kişisel iş akışınız için gereken
notes.txt dosyasını depoya commit etmek istemiyor ve projenin .gitignore dosyasına da eklemek istemiyorsanız, .git/info/exclude içine notes.txt ekleyin
~/.config/git/ignore: makine genelinde kurallar
- Global
ignore dosyası, ana dizindeki ~/.config/git/ignore yolunda bulunur
- Buraya eklenen dosya adları makine düzeyinde global olarak yok sayılır
- Git'e check-in edilmez ve belirli bir depoyla bağlantılı değildir
- Bilgisayarınızdaki tüm Git depolarında yok saymak istediğiniz dosyaları koymak için iyi bir yerdir
- Örnek: macOS'ta
.DS_Store dosyasını buraya eklemek uygundur
Global ignore dosyasının yolunu değiştirme
- Global ignore dosyası başka bir dosya olarak belirtilebilir
- Global Git ignore dosyasını
.gitignore_global olarak kullanmak için şu komutu çalıştırın
git config --global core.excludesFile ~/.gitignore_global
- Varsayılan ayara dönmek için şu komutu çalıştırın
git config --global --unset core.excludesFile
Hangi kuralın dosyayı yok saydığını kontrol etme
git check-ignore -v <dosya_adı> ile belirli bir dosyanın hangi kuralla yok sayıldığını kontrol edebilirsiniz
.DS_Store dosyasının nasıl yok sayıldığını görmek için Git deposu içinde şu komutu çalıştırın
git check-ignore -v .DS_Store
- Deponun
.gitignore dosyası .DS_Store dosyasını yok sayıyorsa örnek çıktı şöyledir
$ git check-ignore -v .DS_Store
.gitignore:1:.DS_Store .DS_Store
- Deponun
.git/info/exclude dosyası .DS_Store dosyasını yok sayıyorsa örnek çıktı şöyledir
$ git check-ignore -v .DS_Store
.git/info/exclude:7:.DS_Store .DS_Store
- Global
~/.config/git/ignore dosyası .DS_Store dosyasını yok sayıyorsa örnek çıktı şöyledir
$ git check-ignore -v .DS_Store
/Users/nelson/.config/git/ignore:2:.DS_Store .DS_Store
- Özel olarak tanımlanmış global ignore dosyası
.gitignore_global, .DS_Store dosyasını yok sayıyorsa örnek çıktı şöyledir
$ git check-ignore -v .DS_Store
/Users/nelson/.gitignore_global:1:.DS_Store .DS_Store
- Belirli bir dosyayı yok sayan kural yoksa
git check-ignore -v komutu hiç çıktı vermez
3 yorum
Çalışma spec’i ya da
plan.mdgibi dosyaları.git/info/excludeiçine koymak da faydalı olabilir.Demek ki kökte ayarlanan bir şey de varmış haha
Hacker News görüşleri
İlginç bir yazı ama Git’te en sevdiğim neredeyse yok sayma özelliği olan
.gitattributeseksik kalmışBu dosyayla Git’in belirli dosyaların farklarını "yok saymasını" sağlayabilirsiniz. Örneğin bir Node projesinde
package-lock.json, Git açısından neredeyse saf gürültüdür. İçinde kütüphanelerin belirli sürümlerine ait devasa farklar görünür; insanların kolay okuyabileceği asıl sürüm bilgisi ise ayrı olarakpackage.jsoniçinde yer alırProje kökündeki
.gitattributesdosyasınapackage-lock.json -diffsatırını eklerseniz, dosya yine stage/commit edilir amagit diffiçinde anlamsız dev farkları görmezsinizpackage-lock.jsongürültü olmamalı. Kasıtlı olarak güncellemiyorsanız değişmemesi gerekir; aksi hâlde gereksiz yere tedarik zinciri riskine maruz kalırsınızpackage-lock.jsondeğişiklikleri sık sık beklenmedik şekilde ortaya çıkıyorsa bir şeyi yanlış yapıyorsunuz demektirpackage-lock.jsontüm geçişli bağımlılıkları gösterir,package.jsonise yalnızca doğrudan bağımlılıkları gösterir. İkincisinin “insanların okuyabildiği gerçek sürümler” olduğu iddiası doğru değilİkisinin amacı farklıdır ve kilit dosyası farklarını her zaman yok sayabileceğinizi söylemek tehlikelidir
git diffkilit dosyası farklarını göstermese gerçekten sinirlenirdimSatır bazlı gürültü gibi göründüğünü anlıyorum ama gerektiğinde kesinlikle gereklidir
Genel/kullanıcı düzeyi exclude ayarları çok daha yaygın bilinmeli. Sık sık IDE/OS/yapay zeka ile ilgili dosyaları tüm projelerin
.gitignoredosyasına eklemeye çalışan değişiklikler alıyorum; bunları standart ayarlara koyarsanız her yerde yok sayılırlar, tek tek projelere dokunmanız gerekmez ve.gitignoregüncellenmemiş projelerde yanlışlıkla commit etme riski de ortadan kalkar dediğimde çoğu kişi bunu memnuniyetle karşılıyorBenim kişisel ilkem, depo içindeki
.gitignoredosyasını yalnızca build çıktıları, dependency klasörleri gibi depoya özgü öğeler için kullanmak; çoğu kullanıcı aracını ise herkesin kendi kullanıcı ayarlarında tutması gerektiği yönünde.gitignoreayarını sık sık anlatmak zorunda kalmanız, depo içi.gitignoredosyasını yalnızca depoya özgü öğeler için kullanma ilkesinin doğal sonucudurHerkesin zamanını daha az harcamak için bu tür dosyaları tüm projelerde doğrudan
.gitignoreiçine koymak daha iyidir.gitignoredosyasına koydumSonuçta o dosyaları yine Git’ten çıkarmak zorunda kalacaklar ve bu onlar için can sıkıcı olacak; ben de nezaket olsun diye en baştan engelliyordum. Gelecekte daha az nazik olabilirim
gitignoretarafını tercih ediyorumgitignorekullanmaktan kaçınacaksak oluşturma script’i ya da volume ile ayarı geri yükleyip koruyabilirsiniz ama bu da.gitignoreya tek satır eklemek yerine ek script’ler veyadevcontainermount ayarı gerektirirGenel Git ayarları ve ignore dosyaları için
~/.gitignore_globaloluşturup ayar değiştirmek yerine bunları~/.config/git/ignoreve~/.config/git/configaltında tutmanın daha doğru olduğunu düşünüyorum~/.config/dizinini farklı amaçlarla kullanırsanız kök seviyedeki dotfile’lar çok daha küçük kalırGit exclude’un daha az kullanılmasının nedeni, depoya commit edilmemesi ve bu yüzden kullanmak istediğiniz her yerde yeniden oluşturmanız gerekmesidir. Bunun kötü olduğunu söylemiyorum; sadece neden daha az kullanıldığını söylüyorum
~/.configdizinini sürüm kontrolüne alırsanız daha sonra düzenlemek ve paylaşmak kolaylaşır~/.cvsignoreda kullanabilirsinizNerede öğrendiğimi hatırlamıyorum ama genel Git ignore listeme
atticeklemiştimBöylece hangi projede olursam olayım asla commit edilmemesi gereken çeşitli şeyleri koyabileceğim bir
atticdizini oluşturabiliyorum. Gerçekten böyle bir dizini denetleyen bir depoyla henüz karşılaşmadımatticgibi bir dizininiz varsa içineattic/.gitignoreoluşturup/**yazarsanız, o dizin ve içindeki her şey yok sayılır; ignore dosyasının kendisi de buna dahildirBen genelde kendi sürümümde dizin adını tek bir U+1F4A9 karakteri yapıyorum ama HN bunun yorumlara yazılmasına izin vermiyor
auxkullanıyorumİçine yalnızca tek yıldız
*bulunan bir.gitignorekoyarsanız kendisini ve içindeki her şeyi yok sayar.localkoydumscratch/Şimdilik başıma iş açmadı
Kullanıcıya özel ignore için, macOS kullanıyorsanız
.DS_Storeöğesini oraya eklemek ideal deniyor ama projedeki tüm Mac kullanıcılarının bunu yapması gerekirİki veya daha fazla kişi varsa bunu herkesin kendine bırakmamak daha iyi olabilir
~/.gitignore_globaldosyasında.DS_Storegirdisi var ve genel Git ayarlarında da bu dosyadaki girdileri yok sayacak yapılandırma bulunuyorYeni Mac’te bu dosyanın tarihi siparişten iki gün öncesine ait ve bunu benim yapılandırdığıma dair bir anım yok; yani varsayılan gelmiş gibi görünüyor. Eski Mac’te de muhtemelen benzerdi; macOS sürümlerine bakınca bunun epey zamandır varsayılan davranış olması mümkün
O yüzden
.DS_Store/satırını.gitignorea eklemek zorunda olduğumuz dönem bitmiş olabilirVay, bunu nasıl bilmiyormuşum? 20 yıllık profesyonel yazılım geliştiricisiyim ve şimdiye kadar sadece
.gitignorekullanmışımSadece beni ilgilendiren türlü exclude öğeleriyle
.gitignoreyu doldurmaktan daha iyi bir yol olup olmadığını kendime hiç sormadığımı fark ettim. Gördüğüm dünyayı olduğu gibi kabul etmişimBugün dünya benim için biraz daha iyi bir yer oldu
.git/info/excludedosyasını gerçekten çok kullanıyorum. Sadece yerelde kullanılan ve iş arkadaşlarının ihtiyaç duymadığı ya da kullanamayacağı script’ler/Makefile’lar için çok uygungit statusçıktısındaki tüm izlenmeyen dosyaları.git/info/excludeiçine atan bir shell fonksiyonu kullanıyorumGenelde depoya eklemek istediklerimi
addvecommitettikten sonra çalıştırıyorumBirden fazla deponun bulunduğu proje dizininde proje düzeyi Git ayarlarını farklı uygulamak için excludes dosyasını şu şekilde kullanıyorum
https://laszlo.nu/blog/project-level-git-config.html
Bununla ilgili kullandığım bazı alias’lar var
assume = update-index --assume-unchangedunassume = update-index --no-assume-unchangedassumed = "!git ls-files -v | grep ^h | cut -c 3-"unassumeall = "!git assumed | xargs git update-index --no-assume-unchanged"assumeall = "!git st -s | awk {'print $2'} | xargs git assume"Zaten izlenen dosyalar için
git update-index --[no]-skip-worktreede varYerel deneyler için faydalı olabilir ama Git’in çok görünür kıldığı bir özellik değil, bu yüzden kullanması biraz zahmetli. Ayarladığınızı hatırlamanız gerekiyor; unutursanız checkout gibi başka işlemleri engelleyebilir