목차
들어가며
개인 프로젝트와 회사 프로젝트를 함께 작업하다 보면, GitHub CLI(gh)를 쓸 때마다 계정을 바꿔야 하는 상황이 생깁니다. 이슈를 올리려는데 회사 계정으로 올라간다거나, PR을 만들었더니 개인 계정으로 등록되는 식입니다.
gh auth switch로 해결할 수 있지만, 디렉토리를 이동할 때마다 이걸 기억해서 실행하는 것은 생각보다 번거롭습니다.
이 글에서는 GH_TOKEN 환경변수와 zsh의 chpwd 훅을 조합해, 디렉토리에 진입하는 순간 계정이 자동으로 전환되도록 설정하는 방법을 소개합니다.
gh auth switch의 한계
gh는 gh auth switch 명령어로 활성 계정을 전환할 수 있습니다.
gh auth switch --user <계정명>
그런데 이 방식은 전역 상태를 변경합니다. 터미널 탭 A에서 계정을 바꾸면 탭 B에도 영향을 줍니다. 동시에 여러 프로젝트를 열어두고 작업할 때는 어떤 계정이 활성화되어 있는지 헷갈리기 쉽습니다.
GH_TOKEN 환경변수 방식
gh는 GH_TOKEN 환경변수가 설정되어 있으면, 저장된 계정 대신 그 토큰을 우선적으로 사용합니다.
export GH_TOKEN=ghp_xxxxxxxxxxxx
gh pr list # GH_TOKEN의 계정으로 실행됨
환경변수는 셸 세션 단위로 격리됩니다. 터미널 탭 A와 탭 B가 각자 다른 GH_TOKEN을 가질 수 있어, gh auth switch의 전역 상태 문제가 없습니다.
토큰은 이미 gh에 로그인된 계정이라면 별도 발급 없이 꺼낼 수 있습니다.
gh auth token --user <개인-계정명>
gh auth token --user <업무-계정명>
chpwd 훅으로 자동 전환하기
zsh의 chpwd 훅은 디렉토리가 변경될 때마다 실행되는 함수입니다. add-zsh-hook chpwd로 등록하면, cd로 이동할 때마다 자동으로 호출됩니다.
GH_TOKEN 전환 로직을 여기에 넣으면, 디렉토리 진입과 동시에 계정이 바뀝니다.
전체 설정 코드
~/.zshrc에 다음을 추가합니다.
# GitHub CLI - 작업 디렉터리에 따라 GH_TOKEN 자동 전환
# ~/personal/* -> 개인 계정
# 그 외 -> 업무 계정
_GH_TOKEN_PERSONAL=$(gh auth token --user <개인-계정명> 2>/dev/null)
_GH_TOKEN_WORK=$(gh auth token --user <업무-계정명> 2>/dev/null)
_gh_pick_account() {
case "$PWD/" in
"$HOME/personal/"*)
export GH_TOKEN="$_GH_TOKEN_PERSONAL" ;;
*)
export GH_TOKEN="$_GH_TOKEN_WORK" ;;
esac
}
add-zsh-hook chpwd _gh_pick_account
_gh_pick_account
gh() {
local label
case "$PWD/" in
"$HOME/personal/"*) label="개인 계정" ;;
*) label="업무 계정" ;;
esac
print -P "%F{cyan}▶ GitHub 계정: %B${label}%b%f"
command gh "$@"
}
적용:
source ~/.zshrc
동작 원리
1. 쉘 시작 시 토큰 캐싱
_GH_TOKEN_PERSONAL=$(gh auth token --user <개인-계정명> 2>/dev/null)
_GH_TOKEN_WORK=$(gh auth token --user <업무-계정명> 2>/dev/null)
gh auth token은 매번 호출하면 약간의 지연이 생깁니다. 쉘 시작 시 한 번만 호출해 변수에 담아두면, 이후 디렉토리 이동마다 추가 지연 없이 즉시 전환됩니다.
2. chpwd 훅으로 GH_TOKEN 전환
_gh_pick_account() {
case "$PWD/" in
"$HOME/personal/"*)
export GH_TOKEN="$_GH_TOKEN_PERSONAL" ;;
*)
export GH_TOKEN="$_GH_TOKEN_WORK" ;;
esac
}
add-zsh-hook chpwd _gh_pick_account
_gh_pick_account # 쉘 시작 시 현재 디렉토리에도 즉시 적용
개인 프로젝트 디렉토리 하위라면 개인 계정 토큰을, 그 외에서는 업무 계정 토큰을 설정합니다. 마지막 _gh_pick_account 호출로 새 터미널을 열었을 때도 바로 적용됩니다.
gh wrapper로 현재 계정 확인하기
계정이 자동으로 바뀌다 보면, 지금 어떤 계정으로 실행되는지 헷갈릴 수 있습니다. gh 명령을 래핑해서 실행 전에 현재 계정을 출력하면 실수를 방지할 수 있습니다.
gh() {
local label
case "$PWD/" in
"$HOME/personal/"*) label="개인 계정" ;;
*) label="업무 계정" ;;
esac
print -P "%F{cyan}▶ GitHub 계정: %B${label}%b%f"
command gh "$@"
}
이제 gh 명령 실행 시 아래와 같이 현재 계정이 표시됩니다.
▶ GitHub 계정: 개인 계정
정리
| 방식 | 터미널 간 격리 | 자동 전환 | 별도 도구 |
|---|---|---|---|
gh auth switch | X (전역 상태) | X | X |
direnv + GH_TOKEN | O | O | 필요 |
chpwd + GH_TOKEN | O | O | X |
chpwd 훅과 GH_TOKEN의 조합은 별도 도구 없이, 디렉토리 이동만으로 GitHub CLI 계정을 자동 전환합니다. 비슷한 패턴으로 다른 CLI 도구도 디렉토리별로 계정을 분리해 관리할 수 있습니다.
제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!
앱 홍보
Deku가 개발한 앱을 한번 사용해보세요.Deku가 개발한 앱은 Flutter로 개발되었습니다.관심있으신 분들은 앱을 다운로드하여 사용해 주시면 정말 감사하겠습니다.