

お世話になります。

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

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

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

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


CC BY-SA 3.0
2016-10-10T14:15:23.233
29463
2022-09-02T09:06:15.307
18982
question
git github
同じPCから複数のGitのアカウントを切り替える方法


OSが何か書かれていませんが、OS上でユーザーを分けたらいかがでしょうか。


CC BY-SA 3.0
2016-10-10T14:50:42.873
29464
2016-10-10T14:50:42.873
8601
29463
answer


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)


CC BY-SA 4.0
2016-10-11T11:49:30.720
29483
2022-09-02T09:06:15.307
2022-09-02T09:06:15.307
8000
8000
29463
answer


参考までに、[GitKraken](https://gitkraken.com/)のProバージョンを使用すると複数アカウントの切り替えが出来るようです。  
(Windows, Mac, Linux対応のGUIクライアントです)

[Frequently Asked Questions](https://support.gitkraken.com/faq)

> **How can I use multiple GitHub / Bitbucket accounts with GitKraken?**  
>  However, with GitKraken Pro‘s multiple profile support, you can easily
> switch between profiles that each have their own associated GitHub and
> BitBucket accounts.


CC BY-SA 4.0
2018-12-20T05:45:45.117
51379
2018-12-20T05:45:45.117
3060
29463
answer


複数アカウントで github 上のリポジトリに対して git 操作が上手くいかない理由は、 [@unarist
さんも述べているように](https://ja.stackoverflow.com/a/29483/754)、 github 社は github
に登録された SSH (公開) 鍵に合致するものを認証として通過させ、その後に認可のロジックを行うような処理になっているため、 git
プロトコル的に同一ホストに対して鍵を使い分けるような設定が基本的にできないから、この問題が発生しています。

@unarist さんの回答では、なので、 `~/.ssh/config` に、鍵ごとに host の設定を行って、その名前でもって git clone
などを行う方法が提示されていますが、これは、アカウントごとにホスト名を変えていかなければならず、ちょっと不便です。

自分が最近行っている方法としては、[git 2.3
以降で導入された](https://github.blog/2015-02-06-git-2-3-has-been-released/)
`GIT_SSH_COMMAND` 環境変数を設定する方法です。例えば以下のように環境変数を設定し、

[code]

    export GIT_SSH_COMMAND='ssh -i ~/.ssh/another-account-key'
    
[/code]

この設定を direnv
を用いるなどしてこのアカウントを使いたい特定の作業用ディレクトリのみで有効化することで、そのディレクトリ以下にこの別アカウントでアクセスしたいリポジトリたちをまとめていけば、普段通りのフローで
git clone を実行できるようになります。

参考として、 `GIT_SSH_COMMAND` は、 git が内部で利用する ssh
コマンドを、指定したコマンドに置き換えるように指示する環境変数です。


CC BY-SA 4.0
2022-08-31T04:50:58.913
90849
2022-08-31T04:50:58.913
754
29463
answer