그동안 회사 프로젝트에도 개인 GitHub 계정을 써왔는데, 최근 회사 계정을 따로 만들면서 분리가 필요해졌습니다. 한 컴퓨터에서 회사 일과 개인 프로젝트를 오가다 보니 불편이 생기더라고요.
- 회사 프로젝트를 커밋했는데 개인 이메일이 찍혀 있거나
- 개인 프로젝트를 push하려는데 회사 계정으로 인증이 되거나
gh pr create를 했는데 엉뚱한 계정으로 PR이 올라가거나- 애초에 서로의 private repository에 접근할 수 없는 상황
이런 불편을 해소하고자 AI와 함께 답을 찾았고, 경험과 노하우를 공유하기 위해 이번 글을 작성해보았습니다.
각자 상황이 다르겠지만, 저는 '회사'와 '개인'으로 구분해 내용을 전개해볼게요.
제 실제 폴더 구조를 예시로 들었습니다.
~/Desktop/repositories/ ├── exem/ ← 회사 프로젝트 (회사 이메일, 회사 SSH 키) │ ├── project-a/ │ └── project-b/ └── personal/ ← 개인 프로젝트 (개인 이메일, 개인 SSH 키) ├── blog/ └── side-project/
이 구조에서 달성할 목표는 세 가지입니다.
- Git 커밋 author → 폴더에 따라 이메일이 자동 설정
- SSH 인증 → 폴더에 따라 맞는 GitHub 계정의 SSH 키가 자동 선택
- gh CLI → 폴더에 따라 맞는 GitHub 계정으로 issue, PR 등을 조작
- macOS (Linux도 거의 동일)
- Git 2.13 이상 (
git --version으로 확인, Conditional Includes는 2.13에서 도입) - GitHub 계정 2개
각 GitHub 계정에 대응하는 SSH 키 쌍을 생성합니다.
https://docs.github.com/en/authentication/connecting-to-github-with-sshSSH는 서버와 안전하게 통신하기 위한 프로토콜이에요. GitHub에 코드를 push하거나 pull할 때 "내가 이 계정의 주인이 맞다"는 걸 증명하는 수단으로 SSH 키를 사용합니다. 비밀키는 내 컴퓨터에, 공개키는 GitHub에 등록해두면 비밀번호 없이도 인증이 가능해요.
# 회사용 SSH 키 ssh-keygen -t ed25519 -f ~/.ssh/id_exem -C "tmdgns1126@ex-em.com" # 개인용 SSH 키 ssh-keygen -t ed25519 -f ~/.ssh/id_personal -C "tmdgns1126@naver.com"
passphrase를 입력하라는 안내가 나옵니다. 쉽게 말해 password입니다. 설정하면 보안이 강화되지만, 매번 입력해야 해서 불편해서 보통은 그냥 넘깁니다. 하지만 대안이 있으니 여기선 그냥 비밀번호를 입력해 넣습니다.
대안은 ssh-agent에 등록하는 겁니다. --apple-use-keychain 옵션을 쓰면 passphrase가 macOS Keychain에 영구 저장돼서, 재부팅 후에도 다시 입력할 필요가 없어요.
# ssh-agent 시작 (macOS는 보통 자동 실행) eval "$(ssh-agent -s)" # 키 등록 — macOS Keychain에 passphrase 영구 저장 ssh-add --apple-use-keychain ~/.ssh/id_exem ssh-add --apple-use-keychain ~/.ssh/id_personal
생성된 파일을 확인합니다.
ls -la ~/.ssh/ # id_exem ← 회사 비밀키 # id_exem.pub ← 회사 공개키 # id_personal ← 개인 비밀키 # id_personal.pub ← 개인 공개키
ed25519는 RSA보다 키 길이가 짧으면서 보안 수준이 동등하거나 높습니다. 현재 GitHub에서 권장하는 알고리즘이에요. 레거시 시스템과의 호환이 필요하다면 ssh-keygen -t rsa -b 4096을 사용하면 됩니다.
생성된 공개키(.pub)를 각 GitHub 계정에 등록합니다.
# 회사 공개키 클립보드에 복사 pbcopy < ~/.ssh/id_exem.pub
- 회사 GitHub 계정으로 로그인
- Settings → SSH and GPG keys → New SSH key
- Title에 식별 가능한 이름 입력 (예:
회사 맥북) - Key type은 Authentication Key 선택
- 붙여넣기 후 저장
# 개인 공개키 클립보드에 복사 pbcopy < ~/.ssh/id_personal.pub
같은 방법으로 개인 GitHub 계정에도 등록해 주세요.
GitHub은 계정당 SSH 키를 여러 개 등록할 수 있어요. 컴퓨터가 여러 대라면 각 컴퓨터에서 를 따로 만들어서 등록하는 게 보안상 안전합니다.
SSH가 github-exem, github-personal이라는 호스트 별명을 인식하도록 설정합니다.
~/.ssh/config 파일을 터미널에서 열어 주세요.
- 파일이 없으면 자동으로 새로 만들어줍니다.
- vim, VS Code 등의 텍스트 편집기로도 열 수 있습니다.
- 가장 쉬운 nano 명령어로 이후 내용을 설명합니다.
nano ~/.ssh/config
아래 내용을 입력합니다.
Host github-exem HostName github.com User git IdentityFile ~/.ssh/id_exem IdentitiesOnly yes Host github-personal HostName github.com User git IdentityFile ~/.ssh/id_personal IdentitiesOnly yes
Ctrl + O 후 Enter를 눌러 저장하고, Ctrl + X를 눌러 종료합니다.
IdentitiesOnly yes가 없으면 ssh-agent가 등록된 키를 순서대로 시도하면서 엉뚱한 키로 인증될 수 있어요. 반드시 설정해 주세요.
SSH는 비밀키의 권한이 너무 열려있으면 보안상 위험하다고 판단해서 아예 무시해버립니다. chmod 명령어로 파일 접근 권한을 좁혀줘야 해요.
700→ 나만 읽기/쓰기/실행 가능 (디렉토리)600→ 나만 읽기/쓰기 가능 (비밀키, config 같은 민감한 파일)644→ 나는 읽기/쓰기, 다른 사용자는 읽기만 (공개키)
chmod 700 ~/.ssh chmod 600 ~/.ssh/config chmod 600 ~/.ssh/id_exem chmod 600 ~/.ssh/id_personal chmod 644 ~/.ssh/id_exem.pub chmod 644 ~/.ssh/id_personal.pub
Git 2.13부터 지원되는 Conditional Includes는 .git 디렉토리의 경로에 따라 다른 설정 파일을 불러오는 기능입니다. 이게 이 가이드의 핵심이에요.
총 3개의 파일을 만들어야 합니다.
https://git-scm.com/docs/git-config#_conditional_includes먼저 글로벌 설정 파일을 열어 주세요.
nano ~/.gitconfig
아래 내용을 입력합니다.
[user] name = 박승훈 email = tmdgns1126@naver.com [includeIf "gitdir:~/Desktop/repositories/exem/"] path = ~/.gitconfig-exem [includeIf "gitdir:~/Desktop/repositories/personal/"] path = ~/.gitconfig-personal
[user]블록은 fallback이에요. 어떤 조건에도 매칭되지 않을 때 사용됩니다.includeIf조건이 참이면 해당path의 설정 파일이 로드되고, 같은 키가 있으면 덮어씁니다.
이어서 회사용, 개인용 설정 파일을 각각 만들어 줍니다.
nano ~/.gitconfig-exem
[user] name = 박승훈 email = tmdgns1126@ex-em.com [url "git@github-exem:"] insteadOf = git@github.com:
개인용 설정 파일도 만듭니다.
nano ~/.gitconfig-personal
[user] name = 박승훈 email = tmdgns1126@naver.com [url "git@github-personal:"] insteadOf = git@github.com:
무슨 원리지?
이 설정이 SSH 키 자동 선택의 핵심입니다. 동작 방식을 따라가 볼게요.
- remote URL이
git@github.com:some-org/some-repo.git으로 설정되어 있다고 가정합니다. ~/Desktop/repositories/exem/하위라면~/.gitconfig-exem이 로드됩니다.insteadOf규칙에 의해git@github.com:이git@github-exem:으로 자동 치환됩니다.- SSH config에서
github-exem호스트는~/.ssh/id_exem키를 사용하도록 되어 있습니다. - 결과적으로 회사 SSH 키로 인증됩니다.
이 덕분에 remote URL을 프로젝트마다 수동으로 바꿀 필요가 없어요. 평범하게 git@github.com:...으로 clone해도 폴더 위치에 따라 자동으로 맞는 키가 선택됩니다.
gitdir 경로 끝에 반드시 /를 붙여야 합니다.
trailing slash가 없으면 하위 디렉토리를 매칭하지 않아요.
# ✅ 올바름 [includeIf "gitdir:~/Desktop/repositories/exem/"] # ❌ 동작 안 함 [includeIf "gitdir:~/Desktop/repositories/exem"]
includeIf는 파일 하단에 배치해야 합니다.
Git config는 나중에 읽힌 값이 이전 값을 덮어씁니다. [user] 블록보다 includeIf가 아래에 있어야 조건부 설정이 글로벌 설정을 정상적으로 override해요.
SSH 연결, Git 사용자 정보, URL 치환이 정상 동작하는지 확인합니다.
# SSH 연결 테스트 ssh -T github-exem # → Hi 회사계정아이디! You've successfully authenticated, ... ssh -T github-personal # → Hi 개인계정아이디! You've successfully authenticated, ...
# Git 사용자 정보 확인 cd ~/Desktop/repositories/exem/아무프로젝트 git config user.email # → tmdgns1126@ex-em.com cd ~/Desktop/repositories/personal/아무프로젝트 git config user.email # → tmdgns1126@naver.com
# URL 치환 확인 cd ~/Desktop/repositories/exem/아무프로젝트 git remote -v # origin git@github.com:exem-company/repo.git (fetch) ← 저장된 URL git ls-remote --get-url origin # git@github-exem:exem-company/repo.git ← 실제 사용되는 URL (치환됨)
이 모든 설정은 SSH 프로토콜(git@github.com:...) 기반입니다. 꼭 repository의 SSH를 remote에 등록해주세요.
HTTPS URL(https://github.com/...)을 사용하면 SSH config와 insteadOf 규칙이 적용되지 않아요. 기존 프로젝트가 HTTPS로 되어 있다면 git remote set-url origin git@github.com:org/repo.git으로 변경해 주세요. 그리고 다시 git remote -v를 통해 확인해 주세요.
저는 GitHub CLI(gh)로 클로드코드에게 issue, PR, release, repo 관리 등 많은 일을 시키고 있습니다.
그래서 SSH 설정과는 별도로 gh 인증도 설정해야 합니다.
gh CLI v2.40.0부터 멀티 계정이 공식 지원됩니다.
https://cli.github.com/manual/gh_auth_switch# 버전 확인 gh --version # gh version 2.40.0 이상이어야 함 # 첫 번째 계정 로그인 (회사) gh auth login # → GitHub.com 선택 → SSH 선택 → 브라우저로 회사 계정 인증 # 두 번째 계정 로그인 (개인) gh auth login # → GitHub.com 선택 → SSH 선택 → 브라우저로 개인 계정 인증 # 로그인된 계정 확인 gh auth status
계정 전환은 이렇게 할 수 있어요.
# 인터랙티브 선택 gh auth switch # 또는 유저명 직접 지정 gh auth switch --user 회사계정아이디 gh auth switch --user 개인계정아이디
gh auth switch는 수동 전환이므로 폴더별 자동 전환이 안 됩니다. 그래서 GH_TOKEN 환경변수를 설정합니다. 그러면 gh auth switch 없이도 자동 전환할 수 있어요.
gh CLI는 GH_TOKEN 환경변수가 설정되어 있으면 이를 최우선으로 사용합니다. 이를 이용해 이미 로그인된 계정의 토큰을 폴더에 따라 자동 주입할 수 있습니다.
2개의 GitHub 계정에서 각각 GH_TOKEN을 발급받아 봅시다. 각 계정의 Settings > Developer settings > Personal access tokens의 경로에서 토큰을 만듭니다. 권한은 용도에 따라 적절히 선택해줍니다. (저는 거의 다 했습니다.)
cd로 폴더를 이동할 때 GH_TOKEN이 자동 전환되도록 셸을 설정하는 방법입니다.
nano ~/.gh-tokens
# chmod 600 export GH_TOKEN_EXEM="ghp_회사토큰값" export GH_TOKEN_PERSONAL="ghp_개인토큰값"
그리고는 .zshrc에 다음과 같이 추가합니다.
source ~/.gh-tokens function _set_gh_token() { case "$PWD" in */Desktop/repositories/exem/*) export GH_TOKEN="$GH_TOKEN_EXEM" ;; */Desktop/repositories/personal/*) export GH_TOKEN="$GH_TOKEN_PERSONAL" ;; esac } # cd를 할 때마다 자동 실행 function cd() { builtin cd "$@" _set_gh_token } # 터미널 시작 시에도 적용 _set_gh_token
적용 후 검증해 봅니다.
source ~/.zshrc cd ~/Desktop/repositories/exem/some-project gh auth status # → 회사 계정으로 로그인됨 cd ~/Desktop/repositories/personal/some-project gh auth status # → 개인 계정으로 로그인됨
SSH config 파일이 인식되지 않는 경우입니다.
# 1. 파일 존재 확인 cat ~/.ssh/config # 2. 권한 확인 및 수정 chmod 600 ~/.ssh/config chmod 700 ~/.ssh # 3. 디버그 모드로 상세 확인 ssh -vT github-exem
디버그 로그에서 Reading configuration data ~/.ssh/config가 보이는지 확인해 주세요. 안 보이면 파일 경로나 권한 문제입니다. 또한 config 파일의 들여쓰기는 스페이스여야 하며, Host 줄 앞에는 공백이 없어야 해요.
HTTPS URL을 사용하고 있을 가능성이 높습니다.
# 현재 remote URL 확인 git remote -v # SSH URL로 변경 git remote set-url origin git@github.com:org/repo.git
이미 커밋된 것을 수정하려면 아래 명령어를 사용합니다.
# 마지막 커밋의 author만 변경 git commit --amend --author="박승훈 <tmdgns1126@ex-em.com>" --no-edit
여러 커밋을 변경해야 하는 경우 git rebase -i를 사용해야 하는데, force push가 필요하니 주의해 주세요.
# 어떤 설정 파일에서 값이 오는지 확인 git config --show-origin user.email # → file:/Users/parkseunghun/.gitconfig-exem tmdgns1126@ex-em.com
--show-origin 옵션은 설정값이 어떤 파일에서 왔는지 보여줍니다. 기대한 파일이 아니라면 gitdir 경로가 includeIf 조건과 맞지 않는 것이에요.
# 현재 활성 계정 확인 gh auth status # GH_TOKEN 환경변수가 설정되어 있는지 확인 echo $GH_TOKEN # 수동 전환 gh auth switch --user 원하는계정아이디
git push (~/Desktop/repositories/exem/some-project) │ ├─ gitdir가 ~/Desktop/repositories/exem/ 하위 │ → ~/.gitconfig-exem 자동 로드 │ ├─ 커밋 author: 박승훈 <tmdgns1126@ex-em.com> │ ├─ url insteadOf: git@github.com: → git@github-exem: │ ├─ SSH config: github-exem → ~/.ssh/id_exem 키 사용 │ └─ 회사 GitHub 계정으로 인증 & push 완료
gh pr create (~/Desktop/repositories/exem/some-project) │ ├─ cd 훅에 의해 GH_TOKEN이 회사 계정 토큰으로 설정됨 │ └─ 회사 GitHub 계정으로 PR 생성 완료
핵심은 세 가지 레이어의 조합입니다. Git Conditional Includes가 폴더를 감지하고, url insteadOf가 SSH Host를 치환하고, SSH config가 맞는 키를 선택해요. 이 세 가지가 맞물려서 "폴더만 맞추면 전부 자동" 환경이 완성됩니다.
여러 환경을 사용하시는 분들께 도움이 되셨길 바랍니다. 감사합니다.
