Git’in sihirli dosyaları
(nesbitt.io)- 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,.mailmapgibi 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-revsve.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,.mailmapgibi ç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
- Bu dosyalar
.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
- Joker karakter (
- Zaten izlenen dosyalar,
.gitignoreeklendikten sonra da izlenmeye devam eder;git rm --cachedile 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
- Örnek:
textsatır sonu normalizasyonu yapar,binarydiff/merge’i devre dışı bırakır,merge=oursise çakışmada yerel sürümü korur- GitHub Linguist,
.gitattributesdosyasını okuyarak dil istatistiklerinden hariç tutma, üretilmiş kodu katlama, belgeleri hariç tutma gibi işlemler yapar - Her dizindeki
.gitattributesdosyaları ile.git/info/attributesbirlikte 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
.gitattributesiçinde LFS ile işlenecek dosyalar belirtilir;.lfsconfigise sunucu konumu gibi ayrıntılı ayarları yönetir- Mevcut commit’lerdeki dosyaları LFS’ye taşımak için
git lfs migratekomutu gerekir
.gitmodules
- Alt modül yapılandırma bilgilerini saklar
- Her modülün yolunu, URL’sini ve branch bilgisini içerir
- Örnek:
[submodule "vendor/lib"] path = vendor/lib url = https://github.com/example/lib.git branch = main
git submodule addsırasında oluşturulur,git submodule updatesırasında referans alınırgit clonesırasında alt modüller otomatik çekilmez;--recurse-submodulesseçeneği gerekir- Sürüm aralığı takibi yapılamaması ve iç içe
.gitdizinleri oluşması gibi dezavantajları vardır
.mailmap
- Yazar adı ve e-posta adreslerini birleştirerek yönetir
- Örnek:
Jane Developer <[email protected]> <[email protected]>
- Örnek:
git log,git shortlog,git blamegibi çıktılarda birleştirilmiş adla gösterilir- GitHub’ın katkıda bulunanlar grafiği mailmap’i yansıtmaz
- Konum,
.mailmapya damailmap.fileayarıyla belirtilebilir
.git-blame-ignore-revs
git blameiç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-revsile 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
- Örnek:
git config commit.template .gitmessageile ayarlanması gerekir- Clone sonrası elle ayar gerektirir; bazı ekipler bunu husky gibi araçlarla otomatikleştirir
- Alternatif olarak
commit-msghook’u ya daprepare-commit-msghook’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.ymlveya.builds/*.ymlkullanı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.allowedSignersFileile belirtilebilir - .gitreview: Gerrit kod inceleme sunucusu ayar dosyası
- Örnek:
[gerrit] host=review.opendev.org port=29418 project=openstack/nova.git defaultbranch=master
- Örnek:
- .gitlint: Commit mesajı lint kurallarını tanımlar
- Örnek:
[general] ignore=body-is-missing [title-max-length] line-length=72
- Örnek:
- .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
.gitignoreile 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 = valueyapısındadır vegit configkomutuyla 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ı