🐙

Windowsで会社用と個人用のGitHubアカウントを Httpsを使って簡単に切り替える方法を丁寧に説明する。

2022/03/03に公開約5,600字

Windows で Https を使って複数アカウントを切り替えるできるようにする方法です。
会社用の GitHub リポジトリには会社用の GitHub アカウント使用し、
個人用の GitHub リポジトリには個人用の GitHub アカウントを使用できるようにします。

この情報は Windows 限定です。
複数アカウントはすべて GitHub のアカウントを想定しています。

シングルアカウントで GitHub に Https 接続する

まずはシングルアカウントで GitHub に Httpsで接続します。

初期設定

まずは下記のコマンドでユーザー名とメールアドレスを確認します。

git config --global --list


設定されていなければ、下記のコマンドで設定します。

git config --global user.name <ユーザー名>
git config --global user.email <メールアドレス>

タイプミスした場合など、該当するキーを削除したい時は、下記のコマンドです。

git config --global --unset <キー名>

このユーザー名とメールアドレスは GitHub に接続するために使用するものではなく、コミット時に記録されるユーザー名とメールアドレスになります。

GitHub 通信方法

GitHub リポジトリに接続するには HTTPS と SSH の2種類の通信方式があります。

Https 通信

Https 通信の場合、GitHub リポジトリに Push や Clone などで初回接続する時に、認証が必要です。

  • ブラウザでの認証
  • パーソナルアクセストークンを使用する認証

「Sign in with your browser」ボタンで認証

「Sign in with your browser」ボタンを選択すると、ブラウザが開きます。
GitHub にサインインしていなければ、GitHub のサインイン画面が表示されます。
(すでにサインイン済みであれば、サインイン画面は表示されません。)
GitHub へサインインすることで認証成功と表示されます。

Windowsの場合、初回接続時の接続情報が「資格情報マネージャー」に登録されます。
2回目以降はこの登録された資格情報を使用して認証されるので、GitHub のサインインは不要になります。

資格情報マネージャーは、
コントロールパネル > ユーザーアカウント > 資格情報マネージャー で確認できます。

この登録されている資格情報を削除すると、リポジトリに接続する際に再度認証を求められます。

Sign in with a code

「Sign in with a code」を選択すると、下記のような画面が表示されます。

https://github.com/login/device リンクをクリックし、開いたブラウザにコードを入力します。

この方法でも「資格情報マネージャー」に登録されます。

どちらも選ばずにダイアログを閉じる(補足)

ちなみに「Sign in with your browser」「Sign in with a code」のどちらも選ばずにダイアログを閉じると、アカウント名とパスワードの入力を求められます。

しかし、こちらで入力しても下記のようにエラーになり認証されません。

Support for password authentication was removed on August 13, 2021.
Please use a personal access token instead.
パスワード認証のサポートは、2021年8月13日に終了しました。
代わりに個人用アクセストークンをご利用ください。

複数アカウントで GitHub に Https 接続する

Windowsでは、初回にGitHubと認証するだけで2回目以降は資格情報マネージャーに登録されている資格情報が使用されます。
単一アカウントの場合、これで何の問題ありません。

しかし、会社用のGitHubアカウントと個人用のGitHubアカウントなど複数アカウントを使用している場合は面倒です。
資格情報マネージャーに、自宅用の GitHub 資格情報が登録されている状態で、会社用のGitHubリポジトリにpushしようとするとエラーが発生します。
資格情報マネージャーから GitHub の資格情報を削除すれば、再度認証が求められるので、会社用のGitHub アカウントで認証すれば push できるようにはなりますが、毎回資格情報を削除するのは面倒です。

そこでリポジトリ単位で資格情報を設定できるようにします。
たとえば会社用のリポジトリであれば、そのリポジトリで設定した資格情報を使用し、個人用であればグローバル設定の資格情報を使用できるように設定します。

git の global 設定を整理

まずは git のグローバル設定を整理します。
以下のコマンドでグローバル設定の内容が確認できます。

git config --global --list

グローバル設定のユーザー名とパスワードはメインで使用するアカウントのユーザー名とメールアドレスを設定します。
このユーザー名はコミット履歴などに表示されます。
サブアカウントのユーザー名が設定されていばければ、コチラが使われますのでウッカリがあっても大丈夫な無難な名前をオススメします。

git config --global user.name <ユーザー名>
git config --global user.email <メールアドレス>

次にgitの資格情報を保存するツールを資格情報マネージャー「wincred」に設定します。

git config --global credential.helper wincred

「credential.helperselector.selected=●●●●●」ような記述がある場合、 unset で削除しておきます。

git config --global --unset credential.helperselector.selected

設定内容を確認しておきます。

資格情報マネージャー github の資格情報を削除

必須の作業ではないですが、資格情報マネージャーから一旦 github の資格情報を削除しておきます。
資格情報マネージャーは、
コントロールパネル > ユーザーアカウント > 資格情報マネージャー で確認できます。
削除するのは git:https://github.com です。

サブアカウントの設定

会社用のアカウントをサブアカウントとして設定していきます。

まず、会社用のアカウントで git 管理するフォルダへ移動します。
このフォルダは空っぽの状態です。
下記のコマンドで、このフォルダとリモートリポジトリをリンクします。
※ユーザー名やリポジトリ名は適宜読み替えてください。

git init
git remote add origin https://github.com/<companyusername>/<companyrepository>.git

ローカルの設定ファイルを確認します。
ターミナルから下記のコマンドで確認できます。

git config --local --list

ローカルの設定ファイルに会社用のユーザー名とメールアドレスを設定します。

git config --local  user.name <会社用ユーザー名>
git config --local  user.email <会社用メールアドレス>

次に git 資格情報の管理ツールを、資格情報マネージャー「wincred」に設定します。

git config --local credential.helper wincred

リモートリポジトリのURLを変更します。
https:// の後に サブアカウント名@ を追加します。

git remote set-url origin https://<companyusername>@github.com/<companyusername>/<companyrepository>.git

設定内容を確認しておきます。

動作確認として、何かファイルを追加し、push します。

git add -A
git commit -m "first"
git push -u origin main

ブラウザで認証すると、資格情報マネージャーに追加されます。
グローバルで登録した資格情報は git:https://github.com でしたが
ローカルで登録した資格情報は git:https://<companyusername>@github.com となっています。

コミット履歴を確認してみます。

git log

ローカルの設定ファイルで設定したユーザー名、メールアドレスが表示されています。

メインアカウントの設定

個人用のアカウントをメインアカウントとして設定していきます。
といっても何も設定することはありません。
資格情報マネージャーからグローバルの GitHub 資格情報が削除されていますので、接続する際に認証を求められます。

まとめ

今回は個人アカウントをメインアカウントにしましたが、
会社用のローカル設定ファイルに、ユーザー名、メールアドレスを設定し忘れると、グローバルのユーザー名、メールアドレスが使用されてしまうのは問題です。

グローバル設定のユーザー名とメールアドレスは削除しておき、
メインアカウントでもサブアカウントでも、リポジトリごとのローカル設定でユーザー名とメールアドレスを設定しておいた方がよいかもしれません。

グローバル設定とローカル設定の両方で、ユーザー情報を設定していないと
コミット時に「誰なの?」と怒られコミットできませんので安心です。

Discussion

ログインするとコメントできます