맥북 한대로 GitHub 여러 계정 SSH키 없이 사용하는 방법(oauth_token)

나는 Github ID를 2개 이상 사용하고 있다.

코드를 수정하고 있을때는 상관이 없다가, 무심결에 개인 Git Profile 상태에서 업무용 깃헙 리포에 Push를 한적이 있다.


깃 프로필 변경을 잊어버린 것 이기도 하지만 필요에 의해 수시로 Git 프로필을 변경하고 클론받은 Github 리포에 Push를 하는 경우가 많다보니 종종 민망한 Git History 를 만들곤 하는 것이다.


그래서 귀잖게 SSH PEM Key를 만들고 관리할 필요 도 없고, 간단하게 Github 로그인 인증으로 만든 Token과 아이디를 스위칭해서 한대의 pc로 여러 Github 계정을 사용하도록 설정을 사용중이다. (autoenv를 사용하면 폴더에 들어갔을때 자동 스위칭도 가능하다)

MacOS의 Github command-line tool 정보
MacOS의 Github command-line tool 정보

 

노트북 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