メインコンテンツへスキップ
見出し画像
Photo bytkganz

GitHubアカウントを2つ使っていると、git pushで地味にハマる話

    GitHubのアカウントを2つ使っている。
    たとえば、個人用と仕事用。
    あるいは、自社用と別プロジェクト用。
    一見すると便利なのだけれど、ローカル開発環境で git push しようとした瞬間に、ちょっとした混乱が起きる。
    「このリポジトリには、このアカウントでpushしたい」
    ただそれだけなのに、意外とめんどい。

    remoteは合っているのにpushできない

    今回の状況はこうだった。

    git remote -v

    結果はこう。

    origin  https://github.com/kumakake/crm.git (fetch)
    origin  https://github.com/kumakake/crm.git (push)

    push先はちゃんと kumakake/crm になっている。
    つまり、リモートリポジトリの設定は間違っていない。
    でも、GitHub CLIの認証状態を確認するとこうだった。

    gh auth status
    github.com
      ✓ Logged in to github.com account damedame
      - Active account: true
      - Git operations protocol: https

    ここで気づく。
    リポジトリの向き先は kumakake。
    でも、ローカルの認証は damedame。
    つまり git push すると、damedame として kumakake/crm にpushしようとしてしまう。
    remoteは合っている。
    でも、認証している人が違う。
    このズレが原因だった。

    ブラウザのログインと、Gitの認証は別物

    最初にややこしいのがここ。
    GitHubをブラウザで開くと、複数アカウントが表示される。
    「damedame」
    「kumakake」
    どちらでログインするか選べる。
    ただし、これはあくまでブラウザ上の話。
    ローカルの git push で使われる認証情報とは別である。
    Gitの認証は、HTTPSならGitHub CLIやmacOSのキーチェーン、Credential Managerなどに保存されている情報が使われる。
    なので、ブラウザで kumakake にログインしていても、ローカルでは damedame の認証情報を使っている、ということが普通に起きる。
    ややこしい。
    玄関は合っているのに、名札が違う人が入ろうとしている感じ。

    一時的にはGitHub CLIで切り替えればよい

    GitHub CLIを使っている場合は、次のようにログイン状態を確認できる。

    gh auth status

    もし damedame でログインしていて、kumakake に切り替えたいなら、いったんログアウトしてログインし直す。

    gh auth logout --hostname github.com --user damedame

    そして kumakake でログインする。

    gh auth login --hostname github.com --web --git-protocol https

    ログインできたら、GitにもGitHub CLIの認証を使わせる。

    gh auth setup-git

    これでpushできるようになる。

    git push

    ただ、この方法には弱点がある。
    複数アカウントを日常的に使う場合、いちいち切り替えるのが面倒なのだ。
    今日の自分は damedame なのか。
    それとも kumakake なのか。
    人間にもGitにも負荷が高い。

    長期的にはSSHキーをアカウントごとに分けるのが楽

    複数GitHubアカウントを使うなら、HTTPSよりSSH運用のほうが楽だと思う。
    アカウントごとにSSHキーを分ける。
    たとえばこう。

    ~/.ssh/id_ed25519_damedame
    ~/.ssh/id_ed25519_kumakake

    そして ~/.ssh/config に設定を書く。

    Host github-damedame
      HostName github.com
      User git
      IdentityFile ~/.ssh/id_ed25519_damedame
      IdentitiesOnly yes
    
    Host github-kumakake
      HostName github.com
      User git
      IdentityFile ~/.ssh/id_ed25519_kumakake
      IdentitiesOnly yes

    このようにしておくと、リポジトリごとに使うアカウントを固定できる。
    たとえば kumakake 側のリポジトリなら、remoteをこうする。

    git remote set-url origin git@github-kumakake:kumakake/crm.git

    これで、このリポジトリでは常に kumakake 用のSSHキーが使われる。
    確認はこう。

    ssh -T git@github-kumakake

    うまくいけば、こんな感じのメッセージが出る。

    Hi kumakake! You've successfully authenticated...

    あとは普通にpushするだけ。

    git push

    毎回ログインを切り替えなくていい。
    リポジトリごとに「このGitHubアカウントでpushする」が決まる。
    これはかなり平和。

    git config user.name はpushアカウントではない

    ちなみに、ここも勘違いしやすい。

    git config user.name
    git config user.email

    これはコミットの作者情報であって、GitHubへのログインアカウントではない。
    つまり、これを kumakake に変えても、push時の認証が damedame のままなら、damedame としてpushしようとする。
    user.name と user.email は「誰がコミットを書いたか」。
    SSHキーやGitHub CLIの認証情報は「誰としてGitHubに接続するか」。
    似ているけれど、役割が違う。

    まとめ

    GitHubアカウントを複数使っているときに git push でハマったら、見るべきポイントはこの3つ。

    git remote -v

    リモート先が正しいか。

    gh auth status

    GitHub CLIでは誰としてログインしているか。

    ssh -T git@github-kumakake

    SSHではどのアカウントとして認証されているか。
    一時的な対応なら、GitHub CLIでログインし直せばよい。
    ただ、複数アカウントを継続して使うなら、アカウントごとにSSHキーを分けて、~/.ssh/config で管理するのが楽。
    GitHub複数アカウント運用は、HTTPSのままだと「今、自分は誰としてpushしているのか問題」が起きやすい。
    なので、認証の交通整理は人間が毎回がんばるより、SSH設定に任せる。
    Gitに哲学をさせない。
    設定ファイルに淡々と働いてもらう。
    そのほうが、開発環境はだいぶ平和になる。

    終わりに

    普段は X で、Claude Code や VPS 運用、個人開発の試行錯誤について発信しています。よかったらフォローしてください 👇

    X: @kumapress1

    質問や「こんなハマり方したよ」みたいな話もお待ちしてます。

     
     
    まもなく還暦な子供3人の現役プログラマーです。学生時代は紙テープでプログラム作ってました。。もうほとんど博物館ww長く一人で法人をやってますんで、いまは、インフラからWebサービス、アプリ開発まで一人で対応しています! ここでは生活の中でハマったことなどを投稿させていただきます!

    あなたへのおすすめ