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.

7 dk okuma
ibrahimsql
1.328 kelime

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ı engellemekYö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 temizlenmeliYöntem 2.5 (gh CLI veya elle)
Eski commit'lerdeki imzaları temizlemekgit filter-repo ile repo geçmişini yeniden yaz; hook'a gerek yok
İkisi birlikteBiri üretimi engeller, diğeri kaçak kalanları süpürür

PR Workflow Notları#

  1. Hook'u repo template'ine ekle. .githooks/commit-msg olarak versiyonla, README'de git config core.hooksPath .githooks kurulum satırı olsun. Her geliştirici ilk clone'da bir kez çalıştırsın.
  2. 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
  1. 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.
  2. 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ürken Signed-off-by'yi bilerek koru.
  3. Template'i güncel tut. PR template'inde Co-Authored-By yönergesi varsa kaldır; bazı takımlar bunu bilerek bırakır.
  4. 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-authored ile 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#

BelirtiOlası sebepÇözüm
Hook çalışmıyorcore.hooksPath tanımsızgit config --global core.hooksPath ~/.git-hooks
Hook çalışmıyorDosya executable değilchmod +x ~/.git-hooks/commit-msg
Mesajda yine satır varMerge commit mesajıMerge sırasında -m ile ver, template'e güvenme
sed: -i: invalidmacOS vs GNU sedsed -i '' -e ... kullan ya da mktemp'li sürümü al
Yazım bozuldu🤖 emoji encoding sorunugrep -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: abc123satır silinir
🤖 Generated with Claude Codesatır silinir
Mesajın tek satırı imza isegeriye boş mesaj kalır; commit abort olmalı mı?
Signed-off-by: Ben <...>korunur
Hook hata verirsecommit 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

---
Bu yazıyı paylaş:
TwitterLinkedInFacebook

Ne düşünüyorsun?

Tepki bırakarak geri bildirim ver

İlgili Yazılar