11 puan yazan GN⁺ 4 시간 전 | 3 yorum | WhatsApp'ta paylaş
  • 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

 
sudoeng 1 시간 전

Çalışma spec’i ya da plan.md gibi dosyaları .git/info/exclude içine koymak da faydalı olabilir.

 
yangeok 2 시간 전

Demek ki kökte ayarlanan bir şey de varmış haha

 
GN⁺ 4 시간 전
Hacker News görüşleri
  • İlginç bir yazı ama Git’te en sevdiğim neredeyse yok sayma özelliği olan .gitattributes eksik 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ı olarak package.json içinde yer alır
    Proje kökündeki .gitattributes dosyasına package-lock.json -diff satırını eklerseniz, dosya yine stage/commit edilir ama git diff içinde anlamsız dev farkları görmezsiniz

    • package-lock.json gü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ız
      package-lock.json değişiklikleri sık sık beklenmedik şekilde ortaya çıkıyorsa bir şeyi yanlış yapıyorsunuz demektir
    • package-lock.json tüm geçişli bağımlılıkları gösterir, package.json ise 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
    • Bağımlılık yükseltmeleri yapan ve hataların kök nedenini izleyen biri olarak, git diff kilit dosyası farklarını göstermese gerçekten sinirlenirdim
      Satı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 .gitignore dosyası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 .gitignore güncellenmemiş projelerde yanlışlıkla commit etme riski de ortadan kalkar dediğimde çoğu kişi bunu memnuniyetle karşılıyor
    Benim kişisel ilkem, depo içindeki .gitignore dosyası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

    • Genel .gitignore ayarını sık sık anlatmak zorunda kalmanız, depo içi .gitignore dosyasını yalnızca depoya özgü öğeler için kullanma ilkesinin doğal sonucudur
      Herkesin zamanını daha az harcamak için bu tür dosyaları tüm projelerde doğrudan .gitignore içine koymak daha iyidir
    • Bilgisizlik yüzünden insanların bu tür dosyaları projeye eklememesi için onları hep projenin .gitignore dosyasına koydum
      Sonuç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
    • Geliştirme container’ı yeniden build edilse bile ayar kaldığı için gitignore tarafını tercih ediyorum
      gitignore kullanmaktan 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 veya devcontainer mount ayarı gerektirir
    • Aynı yanlış davranışı sürekli görüp, bunu düzeltmenin en kolay yolunu açıkça yasaklayan katı kurallar koymak birbiriyle çelişmiyor mu
  • Genel Git ayarları ve ignore dosyaları için ~/.gitignore_global oluşturup ayar değiştirmek yerine bunları ~/.config/git/ignore ve ~/.config/git/config altı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ır
    Git 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

    • Ek olarak ~/.config dizinini sürüm kontrolüne alırsanız daha sonra düzenlemek ve paylaşmak kolaylaşır
    • Aynı dosyayı kullanan başka araçlar için ~/.cvsignore da kullanabilirsiniz
  • Nerede öğrendiğimi hatırlamıyorum ama genel Git ignore listeme attic eklemiştim
    Böylece hangi projede olursam olayım asla commit edilmemesi gereken çeşitli şeyleri koyabileceğim bir attic dizini oluşturabiliyorum. Gerçekten böyle bir dizini denetleyen bir depoyla henüz karşılaşmadım

    • Biraz tersinden de yapılabilir ama her durumda ayrı ayrı yapmak gerekir
      attic gibi bir dizininiz varsa içine attic/.gitignore oluşturup /** yazarsanız, o dizin ve içindeki her şey yok sayılır; ignore dosyasının kendisi de buna dahildir
      Ben 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
    • Ben aux kullanıyorum
      İçine yalnızca tek yıldız * bulunan bir .gitignore koyarsanız kendisini ve içindeki her şeyi yok sayar
    • Ben de bunu yapıyorum. Sadece adını .local koydum
    • Benimki scratch/
      Ş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

    • Nereden geldiğinden emin değilim ama iki Mac’imde de (biri Ventura, biri Sequoia) ~/.gitignore_global dosyasında .DS_Store girdisi var ve genel Git ayarlarında da bu dosyadaki girdileri yok sayacak yapılandırma bulunuyor
      Yeni 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ş olabilir
    • Azınlık ve çoğunluğa bakışınız epey tuhaf. Bir macOS kullanıcısı on projede çalışıyorsa, bu satırı on projenin hepsine mi eklemeli yoksa bunu o tek kullanıcının tarafında çözmek mi daha mantıklı?
  • Vay, bunu nasıl bilmiyormuşum? 20 yıllık profesyonel yazılım geliştiricisiyim ve şimdiye kadar sadece .gitignore kullanmışım
    Sadece 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şim
    Bugün dünya benim için biraz daha iyi bir yer oldu

  • .git/info/exclude dosyası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 uygun

    • Başka iş arkadaşlarının kullanamayacağı script’lere ne tür örnekler verirsiniz merak ettim. Mesela PR iş akışı script’leri gibi mi?
    • Uzun zamandır git status çıktısındaki tüm izlenmeyen dosyaları .git/info/exclude içine atan bir shell fonksiyonu kullanıyorum
      Genelde depoya eklemek istediklerimi add ve commit ettikten sonra çalıştırıyorum
  • Birden 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-unchanged
    unassume = update-index --no-assume-unchanged
    assumed = "!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-worktree de var
    Yerel 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