Git Config ile Kişisel ve Global Ayar Yönetimi
Ekipte beş farklı insanla çalışıyorsanız, büyük ihtimalle şu sahneyi yaşamışsınızdır: Pull request açılıyor, commit’lerin altında “unknown” veya kişisel dizüstü bilgisayarının hostname’i yazıyor. Kod incelemesi yaparken kimin ne yaptığını anlamak zorlaşıyor, CI/CD pipeline’ı “Author not configured” hatası fırlatıyor. Bu kaosun önüne geçmek için Git’in konfigürasyon sistemini doğru anlamak şart. Bugün git config komutunu, scope’larını ve gerçek dünya senaryolarındaki kullanım kalıplarını derinlemesine ele alacağız.
Git Konfigürasyonunun Katmanları
Git, ayarları üç farklı seviyede tutar ve bunlar birbirini hiyerarşik olarak ezer. En özelden en genele doğru:
- –local: Sadece içinde bulunduğunuz repository için geçerli.
.git/configdosyasında saklanır. - –global: Sistemdeki mevcut kullanıcı için geçerli.
~/.gitconfigveya~/.config/git/configdosyasında saklanır. - –system: Tüm kullanıcılar için geçerli.
/etc/gitconfigdosyasında saklanır. Genellikle root yetkisi gerekir.
Bir ayar hem global hem local seviyede tanımlıysa, local olan kazanır. Bu basit kural, iş ve kişisel projeler arasında gidip gelen herkesin hayatını kurtarır.
Mevcut konfigürasyonunuza nereden bakacağınızı bilmek de önemli:
# Hangi ayarın nereden geldiğini görmek için
git config --list --show-origin
# Sadece global ayarları listele
git config --global --list
# Sadece local (repo) ayarlarını listele
git config --local --list
# Belirli bir değeri hangi dosyadan aldığını göster
git config --show-origin user.email
Temel Kimlik Ayarları
Git’te yapmanız gereken ilk şey kendinizi tanıtmak. Her commit’e gömülen isim ve e-posta bilgisi, daha sonra değiştirilmesi çok zahmetli bir şeydir. Özellikle kurumsal repolarda commit geçmişini temiz tutmak kritik.
# Global kimlik tanımı (kişisel geliştirme ortamı için)
git config --global user.name "Ahmet Yılmaz"
git config --global user.email "[email protected]"
# Belirli bir proje için şirket kimliği kullan (repo içinde çalıştır)
git config --local user.name "Ahmet Yılmaz"
git config --local user.email "[email protected]"
Bunu her projede elle yapmak hata yaratır. O yüzden biraz ilerleyen bölümlerde includeIf direktifini kullanarak bunu otomatize edeceğiz.
Editor, Default Branch ve Core Ayarlar
Birçok ekipte default branch ismi konusunda tutarsızlık yaşanıyor. Kimi master, kimi main kullanıyor, pull request’ler karışıyor. Bunu standart hale getirmek için:
# Varsayılan branch adını ayarla (yeni repo'lar için)
git config --global init.defaultBranch main
# Git'in kullanacağı editörü ayarla
git config --global core.editor "vim"
# VS Code tercih edenler için:
git config --global core.editor "code --wait"
# Nano daha rahat hissettiriyorsa:
git config --global core.editor "nano"
# Satır sonu karakterleri (Linux/macOS)
git config --global core.autocrlf input
# Windows'ta çalışıyorsanız
git config --global core.autocrlf true
# Büyük/küçük harf duyarlılığı (özellikle macOS'ta sorun çıkarır)
git config --global core.ignorecase false
core.autocrlf ayarı, Windows-Linux karma ekiplerde karşılaşılan “neden sadece boşluk değişikliği var bu commit’te?” sorununun cevabıdır. Input modu, commit sırasında CRLF’i LF’ye çevirir ama checkout’ta değiştirmez; bu da Linux sunucularına deploy eden ekipler için doğru seçimdir.
Alias Tanımlama: Sık Kullanılan Komutları Kısaltmak
Günde onlarca kez git status, git log --oneline --graph --all yazmak hem yorucu hem de zaman kaybı. Alias’lar bu noktada devreye giriyor:
# Temel alias'lar
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
# Güzel log görünümü (bu özellikle favori)
git config --global alias.lg "log --oneline --graph --decorate --all"
# Son commit'i göster
git config --global alias.last "log -1 HEAD --stat"
# Staged değişiklikleri göster
git config --global alias.staged "diff --cached"
# Takım arkadaşlarının neyi ne zaman commit ettiğini görme
git config --global alias.who "shortlog -sne --all"
git lg komutu, branch yapısını terminal üzerinde görsel olarak gösteren en pratik alias’lardan biridir. Özellikle bir feature branch’i main ile birleştirmeden önce durumu görmek için biçilmiş kaftan.
includeIf ile Koşullu Konfigürasyon
Bu, git config‘in en az bilinen ama en güçlü özelliklerinden biri. Farklı dizinlerdeki projeler için otomatik olarak farklı konfigürasyon dosyaları yükleyebilirsiniz. Evde freelance, işte kurumsal proje yapıyorsanız bu direktif hayat kurtarır.
Önce dizin yapınızı organize edin:
~/projects/
personal/ <- kişisel projeler
work/ <- şirket projeleri
opensource/ <- açık kaynak katkılar
Sonra ~/.gitconfig dosyanıza şunları ekleyin:
# Önce global ayarları düzenle
git config --global user.name "Ahmet Yılmaz"
git config --global user.email "[email protected]"
# includeIf direktifini doğrudan ~/.gitconfig'e eklemek için dosyayı aç
git config --global --edit
Açılan dosyaya şunları ekleyin:
# ~/.gitconfig içeriği
[user]
name = Ahmet Yılmaz
email = [email protected]
[includeIf "gitdir:~/projects/work/"]
path = ~/.gitconfig-work
[includeIf "gitdir:~/projects/opensource/"]
path = ~/.gitconfig-opensource
Ardından ilgili dosyaları oluşturun:
# ~/.gitconfig-work dosyasını oluştur
cat > ~/.gitconfig-work << 'EOF'
[user]
name = Ahmet Yılmaz
email = [email protected]
[core]
sshCommand = ssh -i ~/.ssh/id_rsa_work
EOF
# ~/.gitconfig-opensource dosyasını oluştur
cat > ~/.gitconfig-opensource << 'EOF'
[user]
name = ay-contrib
email = [email protected]
EOF
Artık ~/projects/work/ altında herhangi bir repo’ya girip git config user.email yazdığınızda şirket e-postanızı göreceksiniz. Hiçbir şey yapmadan.
Credential ve SSH Ayarları
Özellikle kurumsal ortamlarda birden fazla GitHub/GitLab hesabı yönetmek sık karşılaşılan bir durum. Biri kişisel, biri iş hesabı. Bunu SSH config ve git config kombinasyonuyla çözebilirsiniz:
# Credential helper ayarları
# macOS için Keychain kullan
git config --global credential.helper osxkeychain
# Linux için cache (15 dakika bellekte tutar)
git config --global credential.helper cache
# Linux için kalıcı depolama (şifreli değil, dikkatli)
git config --global credential.helper store
# Belirli bir host için farklı credential helper
git config --global credential.https://gitlab.sirket.com.tr.helper store
Çoklu SSH anahtarı senaryosunda ~/.ssh/config ile git config’i birlikte kullanmak en temiz yol:
# ~/.ssh/config
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_personal
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_work
Sonra git remote’u buna göre ayarlayın:
# Kişisel repo için
git remote set-url origin git@github-personal:kullaniciadi/repo.git
# İş repo'su için
git remote set-url origin git@github-work:sirket/repo.git
Push, Pull ve Merge Davranışları
Ekip standartlarını zorlamak için bazı davranış ayarları kritik önem taşır:
# Sadece mevcut branch'i push et (güvenli mod)
git config --global push.default current
# Eski davranış isteyenler için (tüm tracking branch'leri push eder)
git config --global push.default matching
# Pull sırasında rebase kullan (merge commit'lerini engeller)
git config --global pull.rebase true
# Fast-forward only (history temizliği için)
git config --global merge.ff only
# Çakışma stilini daha okunabilir hale getir
git config --global merge.conflictstyle diff3
pull.rebase true ayarı, özellikle feature branch üzerinde çalışırken upstream değişikliklerini aldığınızda gereksiz merge commit’lerinin önüne geçer. “Merge branch ‘main’ into feature/xyz” şeklinde onlarca commit satırı görmek history’yi kirletir.
merge.conflictstyle diff3 ise çakışma çözerken üç versiyonu (ata, bizim, karşı) gösterir, bu da hangi değişikliğin doğru olduğunu anlamayı kolaylaştırır.
GPG ile Commit İmzalama
Kurumsal ortamlarda, özellikle regulated sektörlerde (fintech, sağlık) commit’lerin gerçekten iddia edilen kişiden geldiğini doğrulamak gerekebilir. GPG imzalama bu ihtiyacı karşılar:
# GPG anahtarınızın ID'sini öğrenin
gpg --list-secret-keys --keyid-format LONG
# Çıktıdan key ID'yi alıp git'e tanıtın
git config --global user.signingkey 3AA5C34371567BD2
# Her commit'i otomatik imzala
git config --global commit.gpgsign true
# Tag'leri de imzala
git config --global tag.gpgsign true
# GPG programının yolunu belirt (gerekirse)
git config --global gpg.program gpg2
Ekip genelinde zorunlu kılmak istiyorsanız bu ayarı global’e koymak yetmez, repository’nin .git/config dosyasına da eklemek ve bunu bir setup script’ine dahil etmek gerekir.
Gerçek Dünya Senaryosu: Onboarding Script’i
Yeni bir ekip üyesi geldiğinde her seferinde tek tek anlatmak yerine, standart bir kurulum script’i hazırlamak hem zaman kazandırır hem hata riskini azaltır:
#!/bin/bash
# git-setup.sh - Ekip standart Git konfigürasyonu
set -e
echo "Git konfigürasyonu başlıyor..."
read -p "Adınız Soyadınız: " GIT_NAME
read -p "Şirket e-posta adresiniz: " GIT_EMAIL
# Temel kimlik
git config --global user.name "$GIT_NAME"
git config --global user.email "$GIT_EMAIL"
# Ekip standartları
git config --global init.defaultBranch main
git config --global pull.rebase true
git config --global push.default current
git config --global core.autocrlf input
git config --global merge.conflictstyle diff3
# Ekip alias'ları
git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.co checkout
# Editör (değiştirilebilir)
git config --global core.editor "vim"
echo "Konfigürasyon tamamlandı!"
git config --global --list
Bu script’i ekibin iç dokümantasyonuna veya bir internal tool repo’suna ekleyip yeni gelenlere vermek, onboarding sürecinin en dağınık parçalarından birini temizler.
Konfigürasyon Dosyasını Doğrudan Düzenleme
Bazen git config komutlarıyla uğraşmak yerine dosyayı doğrudan açmak daha hızlı:
# Global config dosyasını varsayılan editörde aç
git config --global --edit
# Veya doğrudan
vim ~/.gitconfig
# Bir değeri silmek için
git config --global --unset alias.st
# Tüm bir section'ı silmek için
git config --global --remove-section alias
~/.gitconfig düz metin formatında INI benzeri bir yapıya sahiptir. Doğrudan düzenlerken section başlıklarına ([core], [user] gibi) dikkat edin; yanlış bir girinti veya sözdizimi tüm dosyayı geçersiz kılabilir.
Sık Karşılaşılan Sorunlar ve Çözümleri
Problem: Commit’ler yanlış e-posta ile gidiyor.
# Önce hangi değerin nereden geldiğini kontrol et
git config --show-origin --get user.email
# Sadece bu repo için düzelt
git config --local user.email "[email protected]"
Problem: includeIf çalışmıyor gibi görünüyor.
gitdir: direktifinde trailing slash önemli. ~/projects/work yerine ~/projects/work/ yazılmalı. Ayrıca symlink’li dizinlerde gitdir/i: kullanmak gerekebilir (case-insensitive).
Problem: Windows’tan push edilen dosyalarda sürekli satır sonu farkı çıkıyor.
# .gitattributes dosyası oluştur ve repo'ya ekle
cat > .gitattributes << 'EOF'
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
*.ps1 text eol=crlf
EOF
git add .gitattributes
git commit -m "Add gitattributes for line ending normalization"
Bu .gitattributes yaklaşımı, her geliştiricinin kendi autocrlf ayarına güvenmek yerine repository düzeyinde standardı zorlamak için çok daha sağlam bir yöntem.
Konfigürasyonu Versiyon Kontrolüne Almak
Birden fazla makinede çalışıyorsanız (ev, ofis, remote sunucu) git config dosyalarını da versiyon kontrolüne almak mantıklı. Bunu dotfiles repo’su olarak yönetebilirsiniz:
# Dotfiles repo'su kur
mkdir ~/dotfiles
cd ~/dotfiles
git init
# Symlink yöntemi
cp ~/.gitconfig ~/dotfiles/.gitconfig
ln -sf ~/dotfiles/.gitconfig ~/.gitconfig
# Hassas bilgileri (token, imzalama anahtarı) dışarıda tut
echo ".gitconfig-secrets" >> ~/dotfiles/.gitignore
# Makineler arası fark varsa conditional include kullan
cat >> ~/dotfiles/.gitconfig << 'EOF'
[includeIf "gitdir/i:/home/"]
path = ~/.gitconfig-local
EOF
Dotfiles’ı GitHub’da (private repo olarak) tutup yeni bir makine kurduğunuzda tek komutla senkronize etmek, saatlik manuel konfigürasyonun önüne geçer.
Sonuç
git config göründüğünden çok daha derin bir araç. Çoğu geliştirici user.name ve user.email ayarlayıp bırakıyor, ama yukarıda gördüğünüz gibi davranış standardizasyonu, çoklu kimlik yönetimi, güvenlik (GPG) ve ekip onboarding’i gibi konularda kritik rol oynuyor.
En önemli çıkarımlar şunlar: includeIf direktifini öğrenin, kişisel ve iş projelerinizi ayrı dizinlerde tutun ve bu sayede kimlik karışıklığını tamamen ortadan kaldırın. push.default current ve pull.rebase true ayarlarını ekip genelinde standart hale getirin, commit history’nizi temiz tutun. Son olarak yeni üyeler için bir setup script’i hazırlayın, bu küçük yatırım uzun vadede büyük zaman tasarrufu sağlar.
Git konfigürasyonu bir kere doğru kurulursa arka planda sessizce çalışır ve bir daha düşünmek zorunda kalmazsınız. Zaten iyi bir altyapının en belirgin özelliği de bu değil mi: fark edilmemek.
