Claude Code'da Co-Authored-By İmzasını Kaldırmak
Claude Code'un commit ve PR'lara eklediği 'Co-Authored-By' / 'Generated with' satırlarını iki yolla kaldırmak: settings.json attribution ve commit-msg hook'u.
Claude Code'da Co-Authored-By İmzasını Kaldırmak#
Claude Code ile üretilen commit'lerde varsayılan olarak şöyle bir satır görünür:
Co-Authored-By: Claude <noreply@anthropic.com>
PR gövdelerinde ise şuna benzer bir satır olur:
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Bunu istemiyorsan, ya da PR gövdelerindeki "Generated with Claude Code" satırını da temizlemek istiyorsan iki yöntem var. Önce mevcut durumu kontrol et:
git log -1 --format=full | grep -i -E "co-authored-by|generated with"
Yöntem 1: settings.json attribution#
~/.claude/settings.json içine attribution bloğunu boş string olarak ekle. Böylece Claude Code commit ve PR metnine co-author satırı eklemez:
{ "attribution": { "commit": "", "pr": "" } }
Dikkat: bu ayar yalnızca Claude Code'un eklediği satırı durdurur. Başka araçların (Copilot, Gemini CLI, Codex) eklediği imzaları durdurmaz - onlar için Yöntem 2 gerekir.
Ayarın okunduğunu doğrula:
grep -A4 '"attribution"' ~/.claude/settings.json
Diğer Araçların Karşılıkları#
Aynı temizliği dört araca birden yaymak için her birinin ayar dosyası:
// ~/.claude/settings.json { "attribution": { "commit": "", "pr": "" } }
# ~/.codex/config.toml - commit footer'ını kapat [git] commit_footer = ""
// ~/.gemini/settings.json { "attribution": { "commitMessageSuffix": "" } }
# ~/.grok/config.toml [git] append_coauthor = false
Ayar adları araç sürümleriyle değişebilir. Her araçta güncel anahtar için --help çıktısındaki git/attribution bölümüne bak. JSON dosyalarında // yorumları geçerli değildir; bunları dosyaya yazma, yalnızca karşılaştırma için gösteriyorum.
Yöntem 2: commit-msg hook'u (temizlik garantisi)#
Zaten atılmış commit'lerdeki aynı tarzdaki satırları sonradan temizlemek ya da başka araçlardan gelen benzer imzaları filtrelemek için ~/.git-hooks/commit-msg:
#!/bin/sh # Co-Authored-By ve "Generated with" satırlarını commit mesajından siler. # Idempotent: aynı satır iki kez silinse de sonuç aynıdır. MSG_FILE="$1" TMP_FILE="$(mktemp)" grep -v -E '^Co-Authored-By:|^Claude-Session:|Generated with Claude Code|🤖 Generated with' "$MSG_FILE" > "$TMP_FILE" # Mesajın sonunda kalan boş satırları da temizle; imza silinince # arkada çift boşluk kalmaması için. sed -e :a -e '/^[[:space:]]*$/{$d;N;ba' -e '}' "$TMP_FILE" > "$MSG_FILE" rm -f "$TMP_FILE"
Daha güvenli alternatif - eski sürümdeki gibi yerinde sed yerine:
#!/bin/sh sed -i.bak -e '/^Co-Authored-By:/d' \ -e '/^Claude-Session:/d' \ -e '/Generated with Claude Code/d' \ -e '/🤖 Generated with/d' "$1" rm -f "$1.bak"
İkincisi daha kısa ama macOS'ta sed -i.bak uzantısını zorunlu kılar; onu rm ile silmezsen .*.bak dosyaları kalır. mktemp'li sürüm taşınabilir.
Hook'u aktif et:
git config --global core.hooksPath ~/.git-hooks
chmod +x ~/.git-hooks/commit-msg
Doğrula:
git config --global core.hooksPath # ~/.git-hooks
Hook'u test et - sahte bir mesaj dosyasıyla:
cat > /tmp/test-msg <<'EOF' feat: yeni özellik ekle Co-Authored-By: Claude <noreply@anthropic.com> 🤖 Generated with Claude Code EOF sh ~/.git-hooks/commit-msg /tmp/test-msg cat /tmp/test-msg # Sadece "feat: yeni özellik ekle" kalmalı
Yöntem 2.5: PR Body Temizliği#
Commit mesajı hook'u PR açıklamasına dokunmaz çünkü PR gövdesi git'e değil GitHub'a gider. PR gövdesindeki satırı temizlemek için iki yerden eğil:
# 1) gh CLI ile PR açarken gövdeyi önceden temizle gh pr create --title "feat: x" --body "$(cat pr-body.md | grep -v 'Generated with Claude Code')"
# 2) Açık PR'ın gövdesini güncelle gh pr edit 42 --body "$(gh pr view 42 --json body -q .body | grep -v 'Generated with Claude Code')"
GitHub UI kullanıyorsan, açılan PR açıklamasında satırı elle sil; squash merge sırasında commit mesajına taşabiliyor, o yüzden commit hook'u onu da süpürür.
Makefile ile Alias'lar#
Kurulum ve doğrulamayı tek komuta indir:
HOOKS := ~/.git-hooks .PHONY: hooks-install hooks-test hooks-check strip-trailers hooks-install: mkdir -p $(HOOKS) cp commit-msg $(HOOKS)/commit-msg chmod +x $(HOOKS)/commit-msg git config --global core.hooksPath $(HOOKS) hooks-test: @printf 'feat: x\n\nCo-Authored-By: Claude <n@a.com>\n' > /tmp/t.msg @sh $(HOOKS)/commit-msg /tmp/t.msg @grep -q 'Co-Authored-By' /tmp/t.msg && exit 1 || echo "OK: imza silindi" hooks-check: @git config --global core.hooksPath @test -x $(HOOKS)/commit-msg && echo "hook calistirilabilir" strip-trailers: @git log --format='%B' | grep -c 'Co-Authored-By' || echo "0 imza"
make hooks-test CI'da da çalışır; imzaların sürüklenmediğini garanti eder.
Hangisi Ne Zaman?#
| Durum | Öneri |
|---|---|
| Yalnızca Claude Code'un ürettiği imzaları engellemek | Yöntem 1 yeterli |
| Çoklu araç karışımı (Copilot, Gemini CLI birbirinden farklı imzalar üretiyor) | Yöntem 2 ile tek elden standardize et |
| PR gövdesindeki "Generated with" satırı da temizlenmeli | Yöntem 2.5 (gh CLI veya elle) |
| Eski commit'lerdeki imzaları temizlemek | git filter-repo ile repo geçmişini yeniden yaz; hook'a gerek yok |
| İkisi birlikte | Biri üretimi engeller, diğeri kaçak kalanları süpürür |
PR Workflow Notları#
- Hook'u repo template'ine ekle.
.githooks/commit-msgolarak versiyonla, README'degit config core.hooksPath .githookskurulum satırı olsun. Her geliştirici ilk clone'da bir kez çalıştırsın. - CI'da doğrula. PR workflow'unda son commit mesajını tara:
- name: No AI trailers run: | if git log -1 --format=%B | grep -Eiq 'co-authored-by|generated with claude'; then echo "AI imzası bulundu; hook çalışmamış olabilir" && exit 1 fi
- Squash merge davranışına dikkat. GitHub squash merge sırasında PR gövdesini commit mesajına taşır; hook o noktada devreye girmez çünkü mesaj GitHub tarafında üretilir. O yüzden PR gövdesindeki satırı da temizle.
- CLA / DCO botlarıyla çakışma. Bazı repolar
Signed-off-by:satırı ister; hook bunu silmez çünkü filtrede yok. Kendi satırlarını süpürürkenSigned-off-by'yi bilerek koru. - Template'i güncel tut. PR template'inde
Co-Authored-Byyönergesi varsa kaldır; bazı takımlar bunu bilerek bırakır. - Rebase sonrası tekrar kontrol. Eski commit'leri rebase ile yeniden yazınca hook her commit mesajına tekrar uygulanır;
git log --format=%B | grep -i co-authoredile toplu kontrol et.
Geçmiş Commit'leri Temizlemek#
Zaten pushlanmış commit'lerdeki imzaları silmek hook'la olmaz; geçmişi yeniden yazman gerekir:
# filter-repo kur brew install git-filter-repo # veya: pipx install git-filter-repo # Tüm Co-Authored-By satırlarını sil git filter-repo --message-callback ' return b"\n".join( line for line in message.split(b"\n") if not line.startswith(b"Co-Authored-By:") and b"Generated with Claude Code" not in line ) '
Bu işlem commit hash'lerini değiştirir; ortak branch'e force-push gerekir. Ekibe önceden duyur, yoksa rebase çakışması yaşarsın.
Push'lamadan önce son N commit'i kontrol etmek için pre-push hook'u da ekleyebilirsin:
#!/bin/sh # ~/.git-hooks/pre-push if git log origin/main..HEAD --format=%B | grep -Eiq 'co-authored-by|generated with claude'; then echo "Uzaktan gonderilecek commit'lerde AI imzasi var." >&2 exit 1 fi
Sorun Giderme#
| Belirti | Olası sebep | Çözüm |
|---|---|---|
| Hook çalışmıyor | core.hooksPath tanımsız | git config --global core.hooksPath ~/.git-hooks |
| Hook çalışmıyor | Dosya executable değil | chmod +x ~/.git-hooks/commit-msg |
| Mesajda yine satır var | Merge commit mesajı | Merge sırasında -m ile ver, template'e güvenme |
sed: -i: invalid | macOS vs GNU sed | sed -i '' -e ... kullan ya da mktemp'li sürümü al |
| Yazım bozuldu | 🤖 emoji encoding sorunu | grep -v filtresini locale bağımsız yaz: LC_ALL=C |
Hook'un gerçekten tetiklendiğini görmek için geçici bir echo "hook calisti" >> /tmp/hook.log satırı koy, commit at, sonra logu kontrol et.
Hook'u Test Etmek İçin Vakalar#
| Girdi satırı | Beklenen sonuç |
|---|---|
Co-Authored-By: Claude <...> | satır silinir |
co-authored-by: X (küçük harf) | hook case-sensitive ise kalır - grep -i ile değiştir |
Claude-Session: abc123 | satır silinir |
🤖 Generated with Claude Code | satır silinir |
| Mesajın tek satırı imza ise | geriye boş mesaj kalır; commit abort olmalı mı? |
Signed-off-by: Ben <...> | korunur |
| Hook hata verirse | commit asla engellenmemeli; hook exit 0 dönmeli |
Son satır önemli: temizlik hook'u commit'i kırıyorsa insanlar hook'u devre dışı bırakır. Hook hata verirse exit 0 dönüp mesajı olduğu gibi bırak.
Küçük Bir Not#
Projenin açık kaynak katkı politikası veya gizlilik gereksinimi nedeniyle AI atfediş satırı tutman gereken durumlar olabilir. O zaman hook'u boş string değil, kendi formatına çevir:
sed -i.bak -e 's/^Co-Authored-By:.*/Co-Authored-By: ibrahimsql Attribution <noreply@ibrahimsql.tr>/' "$1"
Ya da daha açık bir metin:
#!/bin/sh sed -i.bak \ -e 's/^Co-Authored-By: Claude.*/Co-Authored-By: Claude (AI-assisted) <noreply@anthropic.com>/' \ -e 's/Generated with Claude Code/AI destekli yazım: Claude Code/' \ "$1" rm -f "$1.bak"
Böylece standart bir satırla hem aracı gösterirsin hem de politikayı karşılarsın. Hook'u her ay bir make hooks-test ile dene; araçlar attribution formatını değiştirince filtre eskir.
// RAPOR SONU Etiketler: Claude Code / Git / Hooks / Configuration
Ne düşünüyorsun?
Tepki bırakarak geri bildirim ver