【GitHub】メインの「アカウントA」とは別の「アカウントB」としてPushしたい

プログラム

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.nameuser.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で登録する。

公開鍵(SSHキー)の登録手順
  • 手順1
    右上のアイコンをクリックして「Settings
  • 手順2
    SSH 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ならmainmasterに読み替えるか、先に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) と進む。

PAT発行手順
  • 手順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を貼る。ターミナルでUsernamePasswordを聞かれるタイプなら、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で上げてしまう事故を防いでくれる。環境に合う方を選んで組んでみてください。

コメント

タイトルとURLをコピーしました