1台のPCで普段は自分のメインアカウント(A)を使ってるんだけど、案件の都合で「このリポジトリだけは別アカウント(B)としてPushしたい」ってことがある。仕事用と個人用を分けたい。
名義を先に済ませてから、認証をSSHで通す方法とHTTPSで通す方法、両方まとめる。環境に合う方を選んでほしい。
① コミットの名義をBにする(そのリポジトリだけ)
そのまえに、リポジトリをまだ用意していない場合、もしくはGitを初期化していない場合。リポジトリを作成、対象フォルダに移動してGitを初期化する。
今回は「NewRepo」という名前でリポジトリを作成。

次にアドレスバーに「cmd」と入力してEnter押下。

こうすることで、対象フォルダーに移動した状態でコマンドプロンプトが起動。
そのまま対象フォルダでgitを初期化。
git init
git add .
git commit -m "initial commit"
そして名義。これはSSH・HTTPSどちらを使う場合でも共通。コマンドプロンプトを起動して対象リポジトリの中でuser.nameとuser.emailをローカル設定する。「–global」を付けないのが最大のポイント。付けるとPC全体(=Aのリポジトリも全部)に効いてしまう。
git config user.name "accountB"
git config user.email "b@example.com"
# ちゃんと設定できたか確認
git config user.name
git config user.email
メールアドレスは、アカウントBのGitHubに登録してあるアドレスにしておくと、コミットがちゃんとBに紐づく。
名義ができたら認証。ここから方法1(SSH)か方法2(HTTPS)のどちらかをやればOK。
②認証をBで通す
方法1:SSHキーを分ける
B専用のSSHキーを作って、そのリポジトリだけBの鍵で認証させる方法。一度設定すればリポジトリごとに鍵で確実に分けられて、事故りにくいのが利点。
1. B専用のSSHキーを作成
# アカウントB専用のSSHキーを保存するフォルダを作成
mkdir %USERPROFILE%/.ssh
# アカウントB専用のSSHキーファイルを作成
ssh-keygen -t ed25519 -C "b@example.com" -f %USERPROFILE%/.ssh/id_ed25519_accountB
パスフレーズを聞かれるので自分の好きな文字列を入力してEnter。
このパスフレーズはのちほど使うので必ず控えて置く。

成功すれば対象フォルダの中にSSHキーが作成される。(WindowsならC:\Users\ユーザー名\.ssh内に作成される)

2. 公開鍵をアカウントBに登録
作成された~/.ssh/id_ed25519_accountB.pubの中身をコピーして、アカウントBのGitHub → Settings → SSH and GPG keys → New SSH keyで登録する。
- 手順1右上のアイコンをクリックして「Settings」

- 手順2SSH and GPG keys → New SSH key

- 手順3作成したSSHキーファイル「id_ed25519_accountB.pub」の内容をコピペ

Titleを未入力でも可。
KeyTypeは「Authentication Key」を選択。
.pubファイル(画像内ではid_ed25519_accountB.pub)の内容をKeyに添付。 - 完了SSHキーの登録完了

3. ssh configにホスト別名を追加
~/.ssh/config(無ければ新規作成。WindowsならC:\Users\ユーザー名\.ssh\config)に、A用とB用の設定を書く。
# ===== メイン:アカウントA(デフォルト) =====
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
# ===== サブ:アカウントB =====
Host github-accountB
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_accountB
IdentitiesOnly yes
ミソはBだけ「github-accountB」という別名(Host)を付けて、使う鍵をid_ed25519_accountBに指定しているところ。
IdentitiesOnly yesを入れておくと、指定した鍵だけで認証しにいくので鍵の取り違えを防げる。
4. 対象リポジトリのremoteを別名に向ける
ここでgithub.comの代わりに、さっきの別名github-accountBを使うのが肝心。
# 「github.com」ではなく、上で作ったホスト別名「github-accountB」を使う
# git initで新規に作った場合は「add」で追加する
git remote add origin git@github-accountB:accountB/repo-name.git
# git cloneした既存リポジトリ(originが既にある)なら「set-url」で差し替える
# git remote set-url origin git@github-accountB:accountB/repo-name.git
# 設定を確認
git remote -v
git initで作ったばかりのリポジトリでset-urlを使うと「error: No such remote ‘origin’」と出る。まだoriginが無いのが理由なので、上の通り新規ならadd、クローン済みならset-urlを使い分ける。Push先の空リポジトリは、先にGitHub側でBアカウントに作成しておくこと。

5. 接続テストしてPush
別名でBとして認証できるか確かめる。
ブランチ名がmasterならmainをmasterに読み替えるか、先にgit branch -M mainで統一する。
# 別名で接続テスト(Bとして認証されるか)
ssh -T git@github-accountB
#SSHキーファイルを作成した時に設定したパスフレーズを聞かれるので入力。
# → 「Hi accountB! You've successfully authenticated, ...」と出ればOK
#ブランチ名の確認
git branch
# 初回だけ -u を付けて上流を設定(次回からは git push だけでOK)
#ブランチ名が「master」なら以下の「main」を「master」に置き換え
git push -u origin main
「Hi accountB!」と自分のアカウントB名が出れば、Bとして認証できている。
あとはいつも通りgit pushすれば、名義もB・認証もBでPushされる。


方法2:HTTPS+パーソナルアクセストークン(PAT)
SSHの鍵ではなく、アカウントBのパーソナルアクセストークン(PAT)で認証する方法。
社内ネットワークなどでSSHのポート(22番)が塞がれている環境でも通りやすいのが利点。
1. アカウントBでPATを発行する
まずアカウントBでGitHubにログインした状態で、Settings → 左メニュー最下部の Developer settings → Personal access tokens → Tokens (classic) → Generate new token(classic) と進む。
- 手順1右上のアイコンをクリックして「Settings」

- 手順2「Developer settings」をクリック

- 手順3タイトル

- 手順4「Note」と権限を設定して発行


スコープ(権限)は「repo」にチェック。Noteと有効期限(Expiration)を設定して発行すると、
ghp_で始まるトークンが表示される。 - 完了トークンを控えて完了

このトークンは発行直後の1回しか表示されないので、その場で必ずコピーして控えておくこと。より権限を絞りたい場合は「Fine-grained tokens」で対象リポジトリを限定し、Contentsを Read and write にする形でもいい。
2. 認証情報をリポジトリごとに分ける設定(重要)
何もしないと、PCに保存済みのアカウントAの認証情報がBのリポジトリにも使い回されてしまうことがある。これを防ぐために、次の設定を入れておく。
# github.com への認証情報を「リポジトリのフルパスごと」に分けて保存する
git config --global credential.https://github.com.useHttpPath true
これでaccountA/repo と accountB/repo で別々の認証情報を覚えてくれるようになる。AとBが混ざらないための肝。
3. 対象リポジトリのremoteをHTTPSにする
URLにユーザー名(accountB)を入れておくと、認証のときにBが選ばれやすくなる。
# ユーザー名 accountB を含めたHTTPSのURLにする
# git initで新規に作った場合は「add」で追加する
git remote add origin https://accountB@github.com/accountB/repo-name.git
# git cloneした既存リポジトリなら「set-url」で差し替える
# git remote set-url origin https://accountB@github.com/accountB/repo-name.git
# 設定を確認
git remote -v

4. 初回Pushで、Bの認証を通す
#ブランチ名の確認
git branch
# 初回だけ -u を付けて上流を設定(次回からは git push だけでOK)
#ブランチ名が「master」なら以下の「main」を「master」に置き換え
git push -u origin main
WindowsだとGit Credential Managerの認証ウィンドウが開くので、ブラウザでアカウントBにサインインするか、「Token」欄に先ほどのPATを貼る。ターミナルでUsername/Passwordを聞かれるタイプなら、UsernameにaccountB、PasswordにPATを入力する。
ここでPasswordにGitHubのログインパスワードを入れても通らないので注意(2021年8月にパスワード認証は廃止済み)。必ずPATを使う。一度通ればWindowsの資格情報マネージャーに保存され、次回からは自動でBとしてPushできる。

もしそれでもAの認証が使われてしまう場合は、「コントロールパネル → 資格情報マネージャー → Windows資格情報」から古いgithub.comのエントリを一旦削除して、もう一度Pushし、Bで入れ直せばいい。
SSHとHTTPS、どっちがいい?
SSH(方法1)は、鍵の作成やconfigの設定など初期の手間はやや多いけど、一度組んでしまえばリポジトリごとに鍵で分かれて事故りにくい。複数アカウントを日常的に使い分けるなら断然こちらがおすすめ。
HTTPS(方法2)は、SSHが塞がれている社内ネットワークやプロキシ環境でも通りやすいのが強み。ただしPATの有効期限が切れたら再発行が必要になる。SSHが使えない環境や、たまにしか使わないなら手軽でいい。
さいごに
整理すると、名義はリポジトリ単位のuser.email/認証はSSHキーかHTTPS+PATのどちらかで切り替える、というのが全体像。
一度この形にしておけば、1台のPCでA・Bが混在しても取り違えずに運用できる。SSHならIdentitiesOnly yesとremoteの別名、HTTPSならuseHttpPathとユーザー名入りURLが、うっかりAで上げてしまう事故を防いでくれる。環境に合う方を選んで組んでみてください。

コメント