WTF Cursor !!
Cursor の Co-authored-by と開発者表示を完全に消す手順(解説書)
この文書は、Cursor(またはそのエージェント)が Git コミットに自動付与する `Co-authored-by: Cursor cursoragent@cursor.com` および GitHub 上の「Contributors」への cursoragent 表示を、恒久的に防止し、既に混入した分も完全に除去するための手順を、手抜きなく記載したものです。
1. 問題の整理
1.1 何が起きているか
さらに、そのコミットの Author または Committer が `cursoragent`(あるいは類似の名前・メール)になっている場合、GitHub のリポジトリ「Contributors」に「cursoragent / Cursor Agent」が表示されます。
実際の開発者はあなたであるにもかかわらず、第三者(Cursor)が共同開発者のように表示される状態になります。
1.2 対処の三本柱

以下、順に完全手順のみを記載します。
2. 今後のコミットに Co-authored-by を付けさせない(commit-msg フック)
2.1 概要
Git の commit-msg フック は、コミットが確定する直前にコミットメッセージが書かれたファイルを渡されます。
ここで「Co-authored-by: … Cursor …」を含む行を削除すれば、リポジトリに残るメッセージには一切その行が入りません。
Cursor がメッセージに付与しても、保存されるコミットからは削除されます。
2.2 フックの置き場所
リポジトリの `.git/hooks/commit-msg` に配置します。
パスの例(Windows): `d:\USERFILES\GitHub\hswq.git\hooks\commit-msg`
このファイルはリポジトリの「作業ツリー」外(`.git` 内)のため、通常の `git add` では追跡されません。クローン先・別マシンでは同じ内容を再度設置する必要があります。
2.3 フックの内容(そのまま使用可能)
以下を そのまま `.git/hooks/commit-msg` に保存してください。先頭の `#!/bin/sh` は必須です。
#!/bin/sh
# Strip Cursor agent co-author trailer; sole author is the human developer.
msgfile="$1"
[ -z "$msgfile" ] || [ ! -f "$msgfile" ] && exit 0
tmp=$(mktemp)
while IFS= read -r line; do
case "$line" in
Co-authored-by:*[Cc]ursor*) ;;
*) printf '%s\n' "$line" ;;
esac
done < "$msgfile" > "$tmp" && mv "$tmp" "$msgfile"
exit 01行目: シェルは `sh`。Git for Windows では Git Bash の `sh` で実行されます。
2行目: コメント。削除対象の意図を残すため推奨。
3行目: `$1` は Git が渡すコミットメッセージファイルのパスです。
4行目: 引数が空、またはファイルが存在しない場合は何もせず正常終了(`exit 0`)。フック失敗にしないため。
5行目: `mktemp` で一時ファイルを作成。上書き元のファイルを安全に書き換えるため。
6–11行目: メッセージを 1 行ずつ読み、`Co-authored-by:` のうしろに `Cursor`(大文字小文字どちらでも)を含む行は出力せず、それ以外はそのまま出力。結果を一時ファイルに書き、成功したら元のメッセージファイルを置き換え。
12行目: 常に成功で終了。
2.4 実行権限(Unix / Git Bash)
Windows で「エクスプローラー+右クリック」のみの環境では必須でない場合もありますが、Git Bash から実行する場合は `chmod +x` をしておくと確実です。
2.5 動作確認
直後に `git log -1 --format=%B` でメッセージを表示し、「Co-authored-by: … Cursor …」の行が含まれていなければ成功です。
3. 既存のコミットから Co-authored-by を削除する(メッセージの書き換え)
3.1 概要
すでにリポジトリに存在するコミットの「メッセージ」から、`Co-authored-by: … Cursor …` の行を削除します。
コミットのハッシュは変わります。 すでに push 済みのブランチに対して行う場合は、後述のとおり force push が必要になります。
3.2 使用するコマンド
対象: 通常は `main` ブランチのみで十分です。他ブランチも同様の履歴を持つ場合は、それぞれに対して実行する必要があります。
注意: `sed` の書式は環境によって異なります。Git for Windows 付属の `sed` では上記で動作します。別の環境では `sed '/^Co-authored-by:.*[Cc]ursor/d'` が 1 行で渡るようにクォートを調整してください。
3.3 実行後のバックアップ ref の削除
`git filter-branch` は、書き換え前の参照を `refs/original/` に残します。この ref が残っていると、ガベージコレクトで古いコミットがすぐには消えず、混乱の元になります。
複数ブランチに対して `filter-branch` を実行した場合は、それぞれに対して `refs/original/refs/heads/<ブランチ名>` を同様に `git update-ref -d` で削除してください。
3.4 実行時間
コミット数が多いと数十秒〜数分かかることがあります。警告メッセージ(filter-branch の非推奨案内)が出ても、今回の用途ではそのまま実行して問題ありません。
4. 既存のコミットの「作者」を cursoragent からあなたに差し替える(必要時のみ)
4.1 いつ必要か
GitHub の「Contributors」は、コミットの Author(および場合により Committer)のメールアドレスで集計されます。
メッセージから Co-authored-by を削除しただけでは、Author が cursoragent のままのコミットがあると、GitHub 上では引き続き cursoragent が貢献者として表示されます。
そのため、「過去のコミットのうち、Author または Committer が cursoragent(あるいは Cursor 関連)になっているもの」を、あなたの名前・メールに書き換える必要があります。
4.2 作者・コミッターの確認
4.3 作者・コミッターの一括書き換え(env-filter)
すべてのコミットについて、「作者が cursoragent(または Cursor)なら、あなたの名前に置き換える」には `--env-filter` を使います。
実行後、再度 `git log --all --format="%h %an <%ae>" | grep -i cursor` で何も出ないことを確認し、`refs/original/refs/heads/main` を `git update-ref -d` で削除してください。
4.4 実行順序
先に メッセージの書き換え(セクション 3)を行い、その後に 作者の書き換え(この節)を行うと、一つの `filter-branch` で両方やるより手順が分かりやすくなります。
両方を一度に行うことも可能ですが、`--msg-filter` と `--env-filter` を同時に指定する形になり、コマンドが長くなるため、ここでは「メッセージ → 作者」の 2 段階を推奨します。
5. .mailmap から cursoragent の行を削除する
5.1 .mailmap の役割
`.mailmap` は、表示用の名前・メールの統一に使われます。`git log` や GitHub の「このコミットの作者表示」を、別の名前に書き換えることができます。
例: `cursoragent cursor@cursor.sh` で記録されているコミットを、「ussoewwin」として表示させる、といった使い方です。
5.2 なぜ削除するか
Cursor を「開発者」として残したくない場合、.mailmap に cursoragent の行があると、その存在が残り続けます。
履歴の作者をあなたに書き換え済み(セクション 4)であれば、cursoragent を .mailmap でマッピングする必要はなく、その行は削除して問題ありません。
5.3 削除する行の例
上記は「cursoragent を ussoewwin として表示する」という意味なので、cursoragent を表示からも消すなら、この行を丸ごと削除します。
編集後、`.mailmap` の変更は通常どおりコミットし、push して構いません。
6. リモートへの反映(force push)
6.1 なぜ force push か
`filter-branch` によりコミットの内容(メッセージや作者)が変わり、コミットハッシュが変わります。 リモートの履歴と「同じコミット」ではなくなるため、通常の `git push` は拒否されます。
開発者があなたお一人であり、main の履歴を上書きしてよい前提であれば、force push でリモートを書き換え済みの履歴に合わせます。
6.2 推奨コマンド
確実に上書きしてよい場合に限り、`git push --force origin main` も使えますが、通常は `--force-with-lease` で十分です。
6.3 他ブランチがある場合
同様の履歴を持つブランチがリモートに存在する場合は、そのブランチに対しても書き換えと force push が必要です。手順は main と同様です。
7. GitHub の「Contributors」から cursoragent を消す(キャッシュ対策)
7.1 現象
履歴の書き換えと force push を完了しても、GitHub のリポジトリトップや「Insights → Contributors」に、しばらく cursoragent が表示され続ける ことがあります。
GitHub は貢献者情報をキャッシュしており、履歴が書き換わっても即時には再計算されないためです。
7.2 デフォルトブランチの切り替えで再計算を促す
多くの場合、デフォルトブランチを一時的に変更し、すぐに元に戻すことで、キャッシュが更新され、Contributors が再計算されます。
GitHub のリポジトリページで Settings → General を開く。
Default branch の右側のスイッチアイコンをクリック。
いったん main 以外(例: 一時用の `temp` ブランチ。存在しなければ事前に作成)を選択し、Update をクリック。
再度 Default branch を main に戻し、Update をクリック。
数分以内に Contributors の表示が更新され、cursoragent が消えることがあります。
7.3 それでも消えない場合
時間をおいて(数時間〜1 日)再度確認してください。
それでも cursoragent が残る場合は、GitHub Support に問い合わせ、「コミット履歴を書き換え、Author をすべて自分に統一したが、Contributors のキャッシュが更新されず cursoragent が表示されたままである。キャッシュの再計算をお願いしたい」旨を伝える方法があります。
8. 検証手順(すべて完了したあと)
8.1 ローカルでの確認
8.2 リモート・GitHub での確認
`git push` 後、GitHub の該当ブランチの コミット一覧 を開き、各コミットのメッセージに「Co-authored-by: … Cursor …」が含まれていないことを確認します。
Insights → Contributors で、cursoragent(または Cursor Agent)が一覧に表示されていないことを確認します。キャッシュの関係で、反映まで少し時間がかかることがあります。
9. トラブルシュート
9.1 commit-msg フックが動かない
パス: 必ず リポジトリの `.git/hooks/commit-msg` であることを確認してください。作業ツリー直下の `hooks` では動作しません。
改行コード: ファイルの改行が LF であることを推奨します。CRLF でも動くことが多いですが、Git Bash で実行エラーになる場合は LF に統一してください。
実行権限: Unix 系・Git Bash では `chmod +x .git/hooks/commit-msg` を実行してください。
フックが無効化されていないか: `git config core.hooksPath` が別のディレクトリを指していると、`.git/hooks/` が使われません。その場合は、指定されているディレクトリに同じ `commit-msg` を配置するか、`core.hooksPath` を未設定に戻してください。
9.2 filter-branch で sed や mktemp がない / エラーになる
Git for Windows を利用している場合、Git Bash から実行すれば `sed` と `mktemp` は通常利用可能です。コマンドプロンプトではなく Git Bash で実行してください。
別の環境では、`sed` のオプションや正規表現が異なることがあります。その場合は、セクション 2 の commit-msg フックと同様のロジック(「Co-authored-by: … Cursor …」を含む行を削除)を、その環境で使えるコマンド(awk や Python など)で書き直してください。
9.3 force push が拒否される
リモートがあなたのローカルより進んでいる(誰かが push した、または別端末で push した)場合、`--force-with-lease` は push を拒否します。その場合は、まず `git fetch origin` で最新を取得し、必要ならマージまたはリベースしたうえで、再度 `git push --force-with-lease origin main` を実行してください。
どうしても上書きしてよい場合は `git push --force origin main` を使えますが、共同で main を使っている場合は必ず合意のうえで行ってください。
9.4 複数ブランチを同じ手順で書き換える場合
各ブランチに対して、セクション 3 および必要に応じてセクション 4 の `filter-branch` を、`main` の部分をそのブランチ名に変えて実行します。
各ブランチについて `refs/original/refs/heads/<ブランチ名>` を `git update-ref -d` で削除し、それぞれ `git push --force-with-lease origin <ブランチ名>` で反映します。
10. 名前を出さずに push する方法
実行するコマンド
`git commit` では `-m "メッセージ"` だけ を使う。`--trailer "Co-authored-by: Cursor cursoragent@cursor.com"` は一切付けない。commit-msg フック(セクション 2)を設置しておけば、万が一 `--trailer` 付きで実行されても、メッセージから該当行が削除され、記録されるコミットには残らない。
.cursorrules と .cursor/rules/git-commit.mdc で「`git commit` は `-m` のみ。`--trailer` を使わない」と明記しておくと、このリポジトリで実行するコマンドに trailer が含まれないよう指示できる。
確実に名前を出したくない場合
エージェントに任せず、自分でターミナルから `git add` → `git commit -m "..."` → `git push` を実行すれば、Co-authored-by は付かない。
11. まとめチェックリスト
[ ] commit-msg フックを `.git/hooks/commit-msg` に設置し、Co-authored-by(Cursor)行を削除する処理が入っている。
[ ] 既存の main のメッセージから Co-authored-by を削除する filter-branch(--msg-filter) を実行した。
[ ] 必要に応じて、cursoragent を作者とするコミットをあなたの名前に差し替える filter-branch(--env-filter) を実行した。
[ ] refs/original/refs/heads/main(および他ブランチ分)を削除した。
[ ] .mailmap から cursoragent のマッピング行を削除した。
[ ] force push(--force-with-lease) でリモートに反映した。
[ ] GitHub の Contributors に cursoragent が残る場合は、デフォルトブランチの切り替え でキャッシュ更新を試した。
[ ] git log でメッセージ・作者に Co-authored-by / cursoragent が残っていないことを確認した。
以上で、Cursor の Co-authored-by と開発者表示を完全に消す手順の解説を終えます。一文字でも手抜きなく記載しました。実施時は、必ずリポジトリのバックアップまたは別クローンで動作確認したうえで、本番の main に対して実行してください。
