こんにちは、さるまりんです 🐒
GitHubにリポジトリを公開して、
「よし、いい感じに置けたぞ」と思っていたある日。
ふとコミット履歴を見て、こうなりました。
……あれ?作者、別アカじゃない?
メインで使っているGitHubアカウントとは別の、
サブアカウント用に作ったプロジェクトでした。
今回は「サブアカウント名義で公開したい」リポジトリだったので、
コミット作者もサブアカウントになっている想定でした。
SSHもちゃんと設定したし、
pushも通ってるし、
リポジトリも正しい。
なのに、コミットの Author が、別アカウントになっている。
どうやら
GitHubのアカウント切り替えに気を取られていて、
Gitの author 情報までは切り替わっていなかったようです。
今回は、この
「Git/GitHubでやってもた!」をどう直したか、
そして 同じMacで複数アカウントを安全に使うためにどう整理したか
をまとめてみます。
起きていたこと(結論から)
まず結論です。
- GitHubアカウントは切り替わっていた
- でも Gitの author 情報は切り替わっていなかった
- その結果
👉 別アカウント名義のコミットが積まれていた
これ、かなり「あるある」だと思っています。
まずは落ち着いて状況確認
焦る前に、まずは現状を確認します。
リモートはどこを向いている?
git remote -v
例:
origin git@github-sub:my-sub-account/my-funny-project.git (fetch)
origin git@github-sub:my-sub-account/my-funny-project.git (push)
👉 SSHの接続先は問題なさそう
このリポジトリの author 設定は?
git config --get user.name
git config --get user.email
例:
Main User
main@example.com
……はい、ここですね。
グローバル設定も確認
git config --global --get user.name
git config --global --get user.email
例:
Main User
main@example.com
ここでようやく、
あ、グローバルがメインアカウントのままだ
と気づきました。
このリポジトリだけ author を切り替える
まずやったのは、このリポジトリ限定での設定変更です。
git config user.name "my-sub-account"
git config user.email "123456789+my-sub-account@users.noreply.github.com"
確認:
git config --get user.name
git config --get user.email
my-sub-account
123456789+my-sub-account@users.noreply.github.com
👉 これで、これからのコミットはOK
……ただし。
問題は「すでに積まれたコミット」
履歴を見てみると。
git log -1 --pretty=full
Author: Main User <main@example.com>
Commit: Main User <main@example.com>
過去のコミットは直っていません。
ここが今回のメインイベントです。
方針:履歴を書き換える(慎重に)
今回は、
- 公開したばかり
- 他に利用者はいない
- mainブランチのみ
という状況だったので、
履歴を書き換える判断をしました。
⚠️ 注意ポイントです。
- すでに共有されているリポジトリ
- 他の人が clone / fork している場合
こういうケースでは、
基本的にやらない方がいいです。
今回は「間に合った」パターンですね。
念のためバックアップを作る
安心して作業するために、まずはバックアップ。
git branch backup/before-author-fix
地味ですが、
この一手があるだけで心の余裕が違います。
ルートから rebase する
git rebase -i --root
エディタが開くので、
すべての pick を edit に変更して保存します。
すると、最初のコミットで止まります。
Stopped at xxxx... Initial commit
You can amend the commit now
各コミットで author を差し替える
止まるたびに、これを実行します。
git commit --amend --reset-author --no-edit
git rebase --continue
これを すべてのコミット分、繰り返します。
終わったら確認。
git log --pretty=full -3
すべてが
Author: my-sub-account <123456789+my-sub-account@users.noreply.github.com>
Commit: my-sub-account <123456789+my-sub-account@users.noreply.github.com>
になっていればOK。
……世界線、戻りました。
リモートへ反映(慎重に)
履歴を書き換えているので、
普通の push はできません。
git push --force-with-lease origin main
ここで --force-with-lease を使います。
--forceより安全- 予期しない上書きを防いでくれる
結果
GitHubのコミット履歴を見ると……
- 全コミットが my-sub-account
- 作者アイコンも一致
- 気持ちがスッとする
正直、
「やっと外に出せた」
という感覚でした。
出せたと思ったのは、ちょっと早かったみたいですが。
今後混ざらないための運用メモ
今回の反省をまとめます。
1. リポジトリごとに user を設定する
git config user.name
git config user.email
2. SSH Host を分ける
Host github-sub
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_sub
3. push前にこれを見る
git log -1 --pretty=full
これだけで、事故率はかなり下がります。
Gitは正直、GitHubは優しい
今回あらためて思ったのは、
- Gitは正直(設定どおりに動く)
- GitHubは優しい(ちゃんと直せる)
ということです。
Gitは、こちらが設定したことを
良くも悪くも、そのままやってくれます。
だからこそ、
「できたものは、できるだけ優しくしたい」
そんな気持ちになりました。
やってもた体験は、
この先の誰かの助けになります。
僕と同じように
「……あれ?」となった人の助けになれば嬉しいです。
読んでくださってありがとうございました。
それではまた!! 🐒