나는 Github ID를 2개 이상 사용하고 있다.
코드를 수정하고 있을때는 상관이 없다가, 무심결에 개인 Git Profile 상태에서 업무용 깃헙 리포에 Push를 한적이 있다.
깃 프로필 변경을 잊어버린 것 이기도 하지만 필요에 의해 수시로 Git 프로필을 변경하고 클론받은 Github 리포에 Push를 하는 경우가 많다보니 종종 민망한 Git History 를 만들곤 하는 것이다.
그래서 귀잖게 SSH PEM Key를 만들고 관리할 필요 도 없고, 간단하게 Github 로그인 인증으로 만든 Token과 아이디를 스위칭해서 한대의 pc로 여러 Github 계정을 사용하도록 설정을 사용중이다. (autoenv를 사용하면 폴더에 들어갔을때 자동 스위칭도 가능하다)
노트북 1대에서 2개의 Github ID를 Oauth로 쉽게 스위칭할 수 있다.
개발용으로 사용중인 MacOS에서는 Github command line Tool을 사용해 스위칭이 가능하다.
설치 방법.
# GitHub command-line tool Install
# https://github.com/cli/cli
> brew install gh
> gh --version
gh version 2.23.0 (2023-02-07)
https://github.com/cli/cli/releases/tag/v2.23.0
Github command-line Tool 자체에서 ID를 스위칭할 수 있는 기능을 만들어 달라고 유저들의 기능요구 사항이 접수된지 오래지만 현재까지(2023.03.05) Github cli는 Multi ID를 정식지원하지 않는다.
- Github cli Issue: https://github.com/cli/cli/issues/326
설정방법
1: gh auth login 으로 만든 oauth token 을 스위칭하자.
스위칭해야 하는 각 Github ID로 로그인을 하면서 '~/.config/gh/host.yml' 을 프로필 마다 백업을 해두자.
- 각기 다른 Github ID로 'gh auth login' 로그인을 하면서 user와 oauth_token 이 들어간 host.yml 을 백업 했다.
- (user, oauth_token 값을 빼두자는 것!, {{____}} 의 내용은 본인의 ID/EMAIL로 변경해서 사용하세요.)
### Set Github Profile Name/Email
> GITHUB_ID_01="{{input_01_name}}"
> GITHUB_ID_02="{{input_02_name}}"
> GITHUB_EMAIL_01="{{input_01_email}}"
> GITHUB_EMAIL_02="{{input_02_email}}"
### 01 start interactive web login setup
# Web authenticate github.com (웹인증)
> gh auth login
> cat ~/.config/gh/hosts.yml
github.com:
user: YourID_01
oauth_token: ghp_xxxxxxxYourToken_01
git_protocol: https
> cp -f ~/.config/gh/hosts.yml ~/.config/gh/hosts.yml.$GITHUB_ID_01
### 02 start interactive web login setup
# Web authenticate github.com (웹인증)
> gh auth login
> cat ~/.config/gh/hosts.yml
github.com:
user: YourID_02
oauth_token: ghp_xxxxxxxYourToken_02
git_protocol: https
> cp -f ~/.config/gh/hosts.yml ~/.config/gh/hosts.yml.$GITHUB_ID_02
2: 'gh alias'에 ID 스위칭 스크립트를 넣자
아래 명령으로 'gh alias' 로 사용할 스크립트를 설정하면 완료 된다.
- {{____}} 의 내용은 본인의 ID/EMAIL로 변경해서 사용하세요.
### Set Github Profile Name/Email
> GITHUB_ID_01="{{input_01_name}}"
> GITHUB_ID_02="{{input_02_name}}"
> GITHUB_EMAIL_01="{{input_01_email}}"
> GITHUB_EMAIL_02="{{input_02_email}}"
### gh alias set --shell {username} "cp ~/.config/gh/hosts.yml.{username} ~/.config/gh/hosts.yml && gh auth status && git config --global user.name {username} && git config --global user.email {username@email.com}"
> gh alias set --shell $GITHUB_ID_01 "cp ~/.config/gh/hosts.yml.$GITHUB_ID_01 ~/.config/gh/hosts.yml && gh auth setup-git && gh auth status && git config --global user.name $GITHUB_ID_01 && git config --global user.email $GITHUB_EMAIL_01"
- Adding alias for company01: cp ~/.config/gh/hosts.yml.company01 ~/.config/gh/hosts.yml && gh auth setup-git && gh auth status && git config --global user.name company01 && git config --global user.email company01@company01.com
✓ Added alias.
> gh alias set --shell $GITHUB_ID_02 "cp ~/.config/gh/hosts.yml.$GITHUB_ID_02 ~/.config/gh/hosts.yml && gh auth setup-git && gh auth status && git config --global user.name $GITHUB_ID_02 && git config --global user.email $GITHUB_EMAIL_02"
- Adding alias for company02: cp ~/.config/gh/hosts.yml.company02 ~/.config/gh/hosts.yml && gh auth setup-git && gh auth status && git config --global user.name company02 && git config --global user.email company02@company02.com
✓ Added alias.
### gh alias에 스크립트가 잘 들어 갔는지 gh config.yml에 'aliases'부분을 확인해본다.
> gh alias list
co: pr checkout
company01: '!cp ~/.config/gh/hosts.yml.company01 ~/.config/gh/hosts.yml && gh auth setup-git && gh auth status && git config --global user.name company01 && git config --global user.email company01@company01.com'
company02: '!cp ~/.config/gh/hosts.yml.company02 ~/.config/gh/hosts.yml && gh auth setup-git && gh auth status && git config --global user.name company02 && git config --global user.email company02@company02.com'
3: Github Multi ID 스위칭 방법
이제 'gh {{alias name}}' 으로 Github ID스위칭과 함께 Git Profile을 쉽게 변경할 수 있게 되었다.
### Set Github Profile Name/Email
> GITHUB_ID_01="{{input_01_name}}"
> GITHUB_ID_02="{{input_02_name}}"
> GITHUB_EMAIL_01="{{input_01_email}}"
> GITHUB_EMAIL_02="{{input_02_email}}"
### Github ID switching with gh command line.
> gh $GITHUB_ID_01
github.com
✓ Logged in to github.com as axgo.tistroy.com (/Users/axgo/.config/gh/hosts.yml)
✓ Git operations for github.com configured to use https protocol.
✓ Token: ghp_************************************
✓ Token scopes: admin:enterprise, admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, admin:ssh_signing_key, audit_log, gist, notifications, project, repo, user, workflow
> gh $GITHUB_ID_02
github.com
✓ Logged in to github.com as axgo.tistroy.com (/Users/axgo/.config/gh/hosts.yml)
✓ Git operations for github.com configured to use https protocol.
✓ Token: ghp_************************************
✓ Token scopes: admin:enterprise, admin:gpg_key, admin:org, admin:org_hook, admin:public_key, admin:repo_hook, admin:ssh_signing_key, audit_log, gist, notifications, project, repo, user, workflow
이젠 git push 를 하기전에 Github ID스위칭을 잊지 말자!
그리고...
- on-my-zsh를 사용한다면 Prompt에 git profile 을 표시하도록 하면 보기가 더 좋아요.
- 'gh auth login' 으로 token을 받을 필요 없이 Github User Setting에서 생성한 Token을 사용 해도 되요.
- autoenv로 클론된 로컬에 들어 갔을때 실행 되게 하려면 (Mac/linux: autoenv, Win: ps-autoenv)
## .env를 자동으로 불러와 주는 autoenv 설치.
> brew install autoenv
## autoenv 활성화 ( 사용자 shell 확인 zsh|bash )
> finger $USER|grep 'Shell:*' | cut -f3 -d ":"
> echo 'export AUTOENV_ASSUME_YES=True' >> ~/.zshrc
> echo 'source $(brew --prefix autoenv)/activate.sh' >> ~/.zshrc
> export AUTOENV_ASSUME_YES=True
> source $(brew --prefix autoenv)/activate.sh
## 폴더에 들어 갔을때 실행될 명령어를 입력해둔다.
> echo 'gh {{change_company_name_01}}' >> repo_path/.env
## 이제 폴더에 들어가면 .env의 'gh alias'가 자동으로 실행 된다.
> cd repo_path
github.com
✓ Logged in to github.com as company_name01 (/Users/axgo/.config/gh/hosts.yml)
✓ Git operations for github.com configured to use https protocol.
✓ Token: gho_************************************
✓ Token scopes: gist, read:org, repo, workflow