- 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
.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
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
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ı
- .gitlint: Commit mesajı lint kurallarını tanımlar
- .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
gitmessage'ı bilmiyordum, sanırım denemeliyimHacker News görüşleri
.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üyorAslında görünmemelerinin nedeni deponun parçası olmamaları. Dosya zaten commit edildiyse, bence tam tersine görünmesi gerekir
.gitignorea ekleseniz de arayüzde görünmeye devam eder. Çünkü o dosya hâlâ repo'nun bir parçasıdırTersine, baştan beri yok sayılan bir dosyayı zorla commit etmek de mümkündür, ama biraz hile gerekir
.gitignoresadece untracked dosyaların gizlenip gizlenmeyeceğini belirler. İsterseniz yok sayılan dosyaları da commit edebilirsinizshowinwebui=(true|false)gibi bir seçenek olsa güzel olurdu 😄.git/info/excludedosyası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 Böylece
git-ignore-local myfile.extile kolayca eklenebiliyorMacOS'ta yalnızca
readlinkkısmını değiştirmeniz gerekir Bu fonksiyonu PATH içindegit-ignore-localolarak kaydedersenizgit ignore-localgibi kullanabilirsiniz.git/info/exclude,.gitignoreaçıklamasının en başında da geçiyor.gitattributesiçine/test export-ignoreeklerseniz, prodüksiyon sunucusuna dağıtım sırasında test dosyalarını hariç tutabilirsinizCapistrano gibi dağıtım araçları
git exportkullandığında bu otomatik uygulanır ve test dosyaları sunucuya gitmezGeliştirme sırasında hiçbir etkisi olmazken disk alanından da tasarruf sağlar
git archiveın kendisini pek bilmiyor gibi görünüyorTemel 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-substseçeneğini kullanırsanızgit describebenzeri bilgileri doğrudan dosyanın içine de yazabilirsinizjjkullanırken.jjklasörünü repo'dan ve tüm git işlemlerinden tamamen hariç tutmak istedimHatta
git clean -xdfile bile silinmesin istedim. Şimdilik bunugit clean -e .jjalias'ıyla geçici olarak çözüyorum.git/info/excludekullanabilirsiniz.mailmapdesteği sunmuyorİlgili tartışma burada: GitHub Community Discussion
package-lock.json merge=oursayarı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-revsiyi 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
(:optional)seçeneğiyle dosya olmasa bile hata vermemesi sağlanabiliyorAçıklama için bkz.: Stack Overflow yanıtı
Ama tüm araçların
.mailmapdesteklememesi üzücü. Örneğin IntelliJ'de bu hâlâ bug/özellik isteği durumundaAyrıca
.git-blame-ignore-revssadece bir gelenek; çalışması için sizin ayrıca ayarlamanız gerekiyor.ignoredosyasını da tanıdığını yakın zamanda öğrendimYalnızca
.gitignoregeçerlidir sanıyordum, ama.ignoreiçinde ripgrep ayarını değiştirince arama sonuçları da değişti. Sonradan bunun mantıklı bir davranış olduğunu fark ettimBağlantı: nesbitt.io yazısı