0
1

GitHub(, GitLab, Codeberg etc.)複数アカウント管理のための ssh, git, gh 周辺セットアップ

Last updated at Posted at 2023-11-18

要旨

GitHubアカウントを複数所持している人がそれらを管理する(使い分ける)際にやっておくと便利な設定をまとめました。
(Macユーザー向けの記事です)

GitHubでは個人が 無料 アカウントを複数所持することは禁止されています。

gh, direnv (, git)のインストール

brew install gh direnv # and git

状況想定

あなたは

  • Alice@github.com
  • Bob@github.com
  • Mike@codeberg.org

という3つのアカウントを所有していて、

  • デフォルトは Alice
  • (カレントディレクトリが ~/dev/repos/github.com/alice 配下で Alice の gh が有効)
  • カレントディレクトリが ~/dev/repos/github.com/bob 配下では Bob
  • カレントディレクトリが ~/dev/repos/codeberg.org/mike 配下では Mike

を使いたいという想定で話を進めます。

各種設定ファイル場所 root 一覧

$HOMEディレクトリは散らかしたくないので、~/.config に置けるものはなるべくそこに置きます。(direnv.envrcの置き場はご自分の環境に依存します)

サービス名 設定ファイル場所 root 内容
ssh ~/.ssh SSH の設定
gh ~/.config/gh gh の設定
git ~/.config/git git の設定
direnv ~/dev/repos/<host>/<username>
~/dev/repos/github.com/bob
~/dev/repos/codeberg.org/mike
direnv の設定

ssh の設定

ssh-keygenで鍵ペア作成(作成方法は他の記事に譲ります)

$ tree ~/.ssh/github
$HOME/.ssh/github
├── alice
│   ├── id_ed25519
│   └── id_ed25519.pub
└── bob
    ├── id_ed25519
    └── id_ed25519.pub

3 directories, 4 files

~/.ssh/codeberg/mikeも同様に作成

~/.ssh/config
# alice
Host github github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github/alice/id_ed25519
  IdentitiesOnly yes

gh の設定

$ tree ~/.config/gh
$HOME/.config/gh
├── alice.yml
├── bob.yml
├── config.yml
└── hosts.yml

1 directory, 4 files

プロトコルをsshにします。

$ gh config set git_protocol ssh

GitHub で personal access token を取得後、下記ファイルの oauth_token にコピペ:

~/.config/gh/alice.yml
github.com:
    oauth_token: *******************************
    user: alice
    git_protocol: ssh

~/.config/gh/bob.ymlも同様

git の設定

コミッターの名前とメアドを設定します。

~/.config/git/config
[user]
    name = Alice
    email = 123456789+alice@users.noreply.github.com
[includeIf "gitdir:~/dev/repos/github.com/bob/"]
    path = ~/.config/git/github/bob
[includeIf "gitdir:~/dev/repos/codeberg.org/mike/"]
    path = ~/.config/git/codeberg/mike
~/.config/git/github/bob
[user]
    name = Bob
    email = 12345678+bob@users.noreply.github.com

~/.config/git/codeberg/mikeも同様に設定

direnv の設定

direnvのフックを.zshrcに追加:

.zshrc
eval "$(direnv hook zsh)" # 追記後 source

~/dev/repos/github.com/bob.envrc を作成し編集します:

bob/.envrc
export GIT_SSH_COMMAND="ssh -i ~/.ssh/github/bob/id_ed25519" # bob/id_ed25519.pub を GitHub に事前に置いておく
/bin/cp ~/.config/gh/bob.yml ~/.config/gh/hosts.yml && gh auth status # この行は GitHub 以外のプラットフォームでは必要ない

アラートに従い direnv allow を実行

:bulb: これ以降このディレクトリに移動した際に.envrcが自動的に読み込まれることになります

下記ディレクトリも似た流れで設定

  • ~/dev/repos/github.com/alice
    (alice/.envrc では bob/.envrc の一行目が要らない(global に設定されているから))
  • ~/dev/repos/codeberg.org/mike
    (mike/.envrc では bob/.envrc の二行目が要らない(GitHubではないため))

最後に

大分省略して書きました。
間違い・不明点ございましたらお知らせ下さい。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1