同じPCから複数のGitのアカウントを切り替える方法


お世話になります。

以前Gitのアカウントを作成して、そのアカウントは自分のプライベートPCでしばらく使用していたのですが、最近、仕事で使用し始めました。

今回、仕事で使用しているGitアカウントと完全に分けるかたちで、別のGitアカウントを作成して、プライベート用の別のアカウント、別リポジトリを作成して使用したいのですが、自分のプライベートPCでpushをすると以前作成した(現在仕事で使用している)ユーザー名で認識されてしまい、「permissionがありません」というエラーが出てきてしまい、pushできません。

どなたか、同じPCでGitのアカウントを分ける方法をご存知でしたらご教示下さい。

よろしくお願い致します。




SSHを使っているかHTTPSを使っているかで変わってきますが・・・

## HTTPSを使う場合

HTTPSでこの問題が発生する場合、credential helper
が資格情報（ユーザー名・パスワード）を記憶しているのだと思います。この場合、URLにユーザー名を記載することで、別の資格情報を記憶させることができます。

[code]

    git clone https://github.com/user_a/aprojectX
     ↓
    git clone https://user_a@github.com/user_a/aprojectX
    
[/code]

参考

  * [githubへgit pushしようとすると403エラーとなる - スタック・オーバーフロー](https://ja.stackoverflow.com/a/23481/8000)
  * [How can I store keychain credentials for multiple Github accounts? - Stack Overflow](https://stackoverflow.com/a/24277934/2818869)

## SSHを使う場合

この場合ユーザーは秘密鍵で識別されるので、秘密鍵を使い分ける必要があります。

環境にもよりますが、コマンドで `git push/pull` している場合はSSH接続に openssh を使っていることでしょう。であれば
`.ssh/config` で接続先ごとに秘密鍵を指定できます。

例えば `.ssh/config` に次のような記述を行い、

[code]

    Host github-private
        HostName github.com
        IdentityFile ~/.ssh/id_rsa_private
    
[/code]

`github.com` の代わりに上で決めた `github-private` をホスト名として使うと、

[code]

    git clone git@github.com:user_a/projectX
     ↓
    git clone git@github-private:user_a/projectX
    
[/code]

`~/.ssh/id_rsa` の代わりに `~/.ssh/id_rsa_private` が使われます。

なお、Githubに限って言えば、

  * プライベート用のリポジトリで仕事用のアカウントをCollaboratorとして登録する
  * （SSHなら）仕事用の公開鍵をプライベート用のアカウントに登録する

といった方法もあります。

参考

  * [Multiple GitHub Accounts & SSH Config - Stack Overflow](https://stackoverflow.com/q/3225862/2818869)

* * *

cloneするURLの書き換えは手でやってもいいですし、例えばある Github ユーザーにまとめて適用するのであれば、gitconfigに
`url.<base>.insteadOf` というエントリを生やすことで自動で置換させることもできます。それこそ HTTPS URL
からの置換をさせることもできます。

[code]

    [url "git@github-private:user_a/"]
        insteadOf = https://github.com/user_a/
    
[/code]

参考 [Git リポジトリ URL を書き換える git-config の設定 "insteadOf" と "pushInsteadOf" \-
kakakakakku blog](https://kakakakakku.hatenablog.com/entry/2020/03/27/093150)

またいずれの方法でもコミット時のnameやemailは別途変える必要があります。これについては conditional includes という機能で、「
`~/private/` 以下ではこの gitconfig を適用する」という設定を行うとかですかね……。

参考 [includeIf を使って git config をプロジェクトごとに読み替える - kakakakakku
blog](https://kakakakakku.hatenablog.com/entry/2019/11/06/114926)

