45 puan yazan GN⁺ 2026-02-24 | 2 yorum | WhatsApp'ta paylaş
  • Git, depo içindeki belirli dosyalar üzerinden çalışma biçimini kontrol eder; bunlar .git/ içindeki ayarlar değil, commit edilip kodla birlikte taşınan dosyalardır
  • .gitignore, .gitattributes, .lfsconfig, .gitmodules, .mailmap gibi dosyalar sırasıyla dosya takibinden hariç tutma, öznitelik tanımlama, LFS ayarları, alt modül yönetimi, yazar birleştirme işlevlerini üstlenir
  • .git-blame-ignore-revs ve .gitmessage, kod biçimlendirme commit’lerini yok sayma ve commit mesajı şablonu sağlayarak iş birliği kalitesini artırır
  • GitHub, GitLab, Gitea gibi platformlar .github/, .gitlab/, .gitea/ gibi forge’a özgü ayar klasörleri üzerinden CI/CD, reviewer atama gibi işlevleri genişletir
  • Bu yapı Git’in ötesinde EditorConfig, Docker, dil sürüm yönetimi araçları gibi alanlarda da aynı şekilde uygulanır ve dotfile tabanlı otomatik yapılandırma ekosistemi oluşturur

Git’in başlıca sihirli dosyaları

  • Git, .gitignore, .gitattributes, .lfsconfig, .gitmodules, .mailmap gibi çeşitli özel dosyaları tanıyarak deponun davranışını kontrol eder
    • Bu dosyalar .git/ içindeki ayarlar değil, commit edilip paylaşılan yapılandırma bileşenleri olduğundan ekip çalışmasında tutarlı davranışı garanti eder

.gitignore

  • Git’in izlememesi gereken dosya desenlerini tanımlar
    • Joker karakter (*.log), dizin (dist/), olumsuzlama (!important.log) desteklenir
    • .gitignore, .git/info/exclude, genel ayar (~/.config/git/ignore) sırasıyla uygulanır
  • Zaten izlenen dosyalar, .gitignore eklendikten sonra da izlenmeye devam eder; git rm --cached ile kaldırılabilir
  • GitHub, GitLab, Gitea gibi platformlarda yok sayılan desenlerle eşleşen dosyalar da uyarı olmadan commit edilebilir
  • GitHub, dile özel .gitignore şablonlarını resmî deposunda sunar

.gitattributes

  • Dosya bazında filtre, diff, merge, satır sonu, dil algılama gibi davranışları kontrol eder
    • Örnek: *.psd filter=lfs, *.png binary, *.sh text eol=lf
  • text satır sonu normalizasyonu yapar, binary diff/merge’i devre dışı bırakır, merge=ours ise çakışmada yerel sürümü korur
  • GitHub Linguist, .gitattributes dosyasını okuyarak dil istatistiklerinden hariç tutma, üretilmiş kodu katlama, belgeleri hariç tutma gibi işlemler yapar
  • Her dizindeki .gitattributes dosyaları ile .git/info/attributes birlikte dikkate alınır

.lfsconfig

  • Git LFS ayarlarını depoyla birlikte paylaşır
    • LFS sunucusu URL’si, aktarım yeniden deneme sayısı gibi ayarlar yapılabilir
    • Örnek:
      [lfs]
          url = https://lfs.example.com/repo
      [lfs "transfer"]
          maxretries = 3
      
  • .gitattributes içinde LFS ile işlenecek dosyalar belirtilir; .lfsconfig ise sunucu konumu gibi ayrıntılı ayarları yönetir
  • Mevcut commit’lerdeki dosyaları LFS’ye taşımak için git lfs migrate komutu gerekir

.gitmodules

  • Alt modül yapılandırma bilgilerini saklar
  • git submodule add sırasında oluşturulur, git submodule update sırasında referans alınır
  • git clone sırasında alt modüller otomatik çekilmez; --recurse-submodules seçeneği gerekir
  • Sürüm aralığı takibi yapılamaması ve iç içe .git dizinleri oluşması gibi dezavantajları vardır

.mailmap

  • Yazar adı ve e-posta adreslerini birleştirerek yönetir
    • Örnek:
      Jane Developer <[email protected]> <[email protected]>
      
  • git log, git shortlog, git blame gibi çıktılarda birleştirilmiş adla gösterilir
  • GitHub’ın katkıda bulunanlar grafiği mailmap’i yansıtmaz
  • Konum, .mailmap ya da mailmap.file ayarıyla belirtilebilir

.git-blame-ignore-revs

  • git blame içinde yok sayılacak commit listesini belirtir
    • Formatter çalıştırma, lint uygulama gibi anlam taşımayan değişiklikleri hariç tutar
    • Örnek:
      # Ran prettier on entire codebase
      a1b2c3d4e5f6g7h8i9j0...
      
  • git config blame.ignoreRevsFile .git-blame-ignore-revs ile etkinleştirilir
  • GitHub, GitLab(15.4+) ve Gitea bunu otomatik tanır
  • Dosya yoksa hata oluşabileceğinden boş bir dosyanın korunması tavsiye edilir

.gitmessage

  • Commit mesajı şablonunu tanımlar
    • Örnek:
      # <type>: <subject>
      #
      # Types: feat, fix, docs, style, refactor, test, chore
      
  • git config commit.template .gitmessage ile ayarlanması gerekir
  • Clone sonrası elle ayar gerektirir; bazı ekipler bunu husky gibi araçlarla otomatikleştirir
  • Alternatif olarak commit-msg hook’u ya da prepare-commit-msg hook’u kullanılabilir

Forge’a özgü genişletme klasörleri

  • GitHub, GitLab, Gitea, Forgejo, Bitbucket gibi platformlar kendilerine ait ayar klasörleri kullanır
    • .github/, .gitlab/, .gitea/, .forgejo/, .bitbucket/
  • CI/CD workflow’ları, issue·PR şablonları, CODEOWNERS dosyaları gibi öğeleri içerir
  • Forgejo, .forgejo/ → .gitea/ → .github/; Gitea ise .gitea/ → .github/ sırasıyla fallback yapar
  • SourceHut, .build.yml veya .builds/*.yml kullanır

Diğer yerleşik dosya gelenekleri

  • .gitkeep: Git boş dizinleri izlemediği için, dizini korumaya yarayan dummy dosya olarak kullanılır
  • .gitconfig: Proje bazlı Git ayarı örnekleri sunar ancak otomatik yüklenmez
  • .gitsigners: GPG/SSH imza anahtarı listesini yönetir; gpg.ssh.allowedSignersFile ile belirtilebilir
  • .gitreview: Gerrit kod inceleme sunucusu ayar dosyası
    • Örnek:
      [gerrit]
      host=review.opendev.org
      port=29418
      project=openstack/nova.git
      defaultbranch=master
      
  • .gitlint: Commit mesajı lint kurallarını tanımlar
    • Örnek:
      [general]
      ignore=body-is-missing
      [title-max-length]
      line-length=72
      
  • .jj/: Git uyumlu VCS olan Jujutsu’nun durum dizinidir; .git/ ile birlikte bulunabilir

Git’in ötesindeki dotfile ekosistemi

  • .editorconfig: Editörler arasında tutarlı kod stili sağlar
    • Girinti, satır sonu, kodlama, sondaki boşlukların silinmesi gibi ayarları tanımlar
    • VS Code, Vim, Emacs gibi başlıca editörler tarafından desteklenir
  • .ruby-version, .node-version, .python-version: Dil sürüm yönetim araçları (rbenv, nodenv, pyenv vb.) tarafından okunur ve otomatik geçiş sağlar
  • .tool-versions: asdf’nin çok dilli sürüm yönetim dosyasıdır
  • .dockerignore: Docker build sırasında hariç tutulacak dosya listesini belirtir
    • .gitignore ile aynı desen sözdizimini kullanır; build hızını artırır ve gizli bilgileri hariç tutar

Git entegrasyon araçları geliştirirken dikkat edilmesi gerekenler

  • Git deposunu işleyen araçlar şu dosyaları mutlaka tanımalıdır
    • .gitignore: dosya taramasında yok sayma desenlerini uygulama
    • .gitattributes: binary ve üretilmiş dosyaları ayırt etme
    • .mailmap: yazar bilgilerini birleştirerek gösterme
    • .gitmodules: alt modül işleme
  • Git yapılandırma dosyası biçimi [section "subsection"] key = value yapısındadır ve git config komutuyla okunup yazılabilir
  • Çoğu dil için Git kütüphaneleri bu biçimi parse etme işlevi sunar

2 yorum

 
wedding 2026-02-24

gitmessage'ı bilmiyordum, sanırım denemeliyim

 
GN⁺ 2026-02-24
Hacker News görüşleri
  • GitHub, GitLab ve Gitea'nın hepsinin .gitignorea uyup web arayüzünde yok sayılan dosyaları göstermediği söylenmişti, ama bu açıklama yanlış gibi görünüyor
    Aslında görünmemelerinin nedeni deponun parçası olmamaları. Dosya zaten commit edildiyse, bence tam tersine görünmesi gerekir
    • Hayır. Daha önce push edilmiş bir dosyayı sonradan .gitignorea ekleseniz de arayüzde görünmeye devam eder. Çünkü o dosya hâlâ repo'nun bir parçasıdır
      Tersine, baştan beri yok sayılan bir dosyayı zorla commit etmek de mümkündür, ama biraz hile gerekir
    • Evet, ilk yorum yanlıştı. .gitignore sadece untracked dosyaların gizlenip gizlenmeyeceğini belirler. İsterseniz yok sayılan dosyaları da commit edebilirsiniz
    • showinwebui=(true|false) gibi bir seçenek olsa güzel olurdu 😄
    • Bu hatayı bir insanın yazmış olabileceğine inanmadığım için, o noktada okumayı bıraktım
  • .git/info/exclude dosyasını özellikle vurgulamak isterim. Bu, yalnızca yerel bir gitignore; yani sadece bana özel bir ayar
    Örneğin bir bug'ı araştırırken geçici dosyalar oluşturup branch değiştirseniz bile onları olduğu gibi bırakmak istediğinizde kullanışlıdır
    Ben bunun için aşağıdaki shell alias'ını kullanıyorum
    git-ignore-local () {
      echo "$1" >> .git/info/exclude
    }
    
    Böylece git-ignore-local myfile.ext ile kolayca eklenebiliyor
    • Kök dizinde olmasanız da çalışması için biraz daha sihirli bir sürüm yaptım
      MacOS'ta yalnızca readlink kısmını değiştirmeniz gerekir
      git-ignore-local () {
        root=$(git rev-parse --show-toplevel)
        path=$(readlink -f "$1")
        relpath=$(relpath -m --relative-to="$root" "$path")
        echo "$relpath" >> "${root}.git/info/exclude"
      }
      
      Bu fonksiyonu PATH içinde git-ignore-local olarak kaydederseniz git ignore-local gibi kullanabilirsiniz
    • .git/info/exclude, .gitignore açıklamasının en başında da geçiyor
    • Bu özelliği ilk kez öğreniyorum. Projemde böyle küçük geçici dosyalar yüzünden PR'ler karmaşıklaşmıştı; bu onun çözümü olabilir
  • .gitattributes içine /test export-ignore eklerseniz, prodüksiyon sunucusuna dağıtım sırasında test dosyalarını hariç tutabilirsiniz
    Capistrano gibi dağıtım araçları git export kullandığında bu otomatik uygulanır ve test dosyaları sunucuya gitmez
    Geliştirme sırasında hiçbir etkisi olmazken disk alanından da tasarruf sağlar
    • Güzel bir özellik, ama çoğu kişi git archiveın kendisini pek bilmiyor gibi görünüyor
      Temel CI araçlarında bile neredeyse hiç kullanıldığını görmedim. Capistrano'nun bunu kullandığını görmek benim için ilk örnekti
      Bu arada export-subst seçeneğini kullanırsanız git describe benzeri bilgileri doğrudan dosyanın içine de yazabilirsiniz
  • jj kullanırken .jj klasörünü repo'dan ve tüm git işlemlerinden tamamen hariç tutmak istedim
    Hatta git clean -xdf ile bile silinmesin istedim. Şimdilik bunu git clean -e .jj alias'ıyla geçici olarak çözüyorum
    • .git/info/exclude kullanabilirsiniz
  • GitHub'ın contributor graph özelliği .mailmap desteği sunmuyor
    İlgili tartışma burada: GitHub Community Discussion
  • package-lock.json merge=ours ayarının riskli olduğunu düşünüyorum
    Çünkü merge veya rebase sırasında ours/theirs anlamı belirsizleşiyor
    Bu tür ayarlar ancak otomatik birleştirme araçlarında anlamlıdır (ör. git-annex branch)
    Not: ours/theirs anlamının açıklaması, git-annex iç yapısı
  • .git-blame-ignore-revs iyi bir özellik, ama “diğer gelenekler” bölümünde yer almalı
    Git istemcisinde ayrıca ayarlamazsanız, bu dosyanın bulunmadığı bir depoda git blame başarısız olur
    • git 2.52'den itibaren (:optional) seçeneğiyle dosya olmasa bile hata vermemesi sağlanabiliyor
      Açıklama için bkz.: Stack Overflow yanıtı
  • Genel olarak iyi derlenmiş bir liste olduğunu düşünüyorum
    Ama tüm araçların .mailmap desteklememesi üzücü. Örneğin IntelliJ'de bu hâlâ bug/özellik isteği durumunda
    Ayrıca .git-blame-ignore-revs sadece bir gelenek; çalışması için sizin ayrıca ayarlamanız gerekiyor
  • Biraz farklı bir konu ama, VS Code'un .ignore dosyasını da tanıdığını yakın zamanda öğrendim
    Yalnızca .gitignore geçerlidir sanıyordum, ama .ignore içinde ripgrep ayarını değiştirince arama sonuçları da değişti. Sonradan bunun mantıklı bir davranış olduğunu fark ettim
  • Yazının yazarı forge-specific repository folders (bir tür “sihirli klasörler”) hakkında bir devam yazısı da yayımlamış
    Bağlantı: nesbitt.io yazısı