blog

git pull에서 Repository not found가 뜰 때: GitHub 다중 계정을 SSH로 정리하기

Front-end / Git#Git#GitHub#SSH#credential helper#다중 계정

증상

잘 쓰던 회사 저장소에서 git pull --rebase를 하자 에러가 났다.

remote: Repository not found.
fatal: repository 'https://github.com/work-org/private-project.git/' not found

저장소도 조직도 그대로 있는데 왜 "not found"일까.

원인 추적

1. remote URL

git remote -v
# origin  https://github.com/work-org/private-project.git

HTTPS 방식이다. HTTPS로 GitHub에 접속하면 git은 OS의 credential helper(macOS는 키체인)에 저장된 자격 증명을 쓴다.

2. 키체인에 저장된 계정

printf "protocol=https\nhost=github.com\n" | git credential-osxkeychain get
# username=...
# password=gho_xxxxxxxx

이 토큰으로 GitHub API를 호출해 보니 개인 프로젝트용 다른 계정이었다.

3. 조직 멤버십

curl -s -H "Authorization: token gho_xxxx" https://api.github.com/user/orgs

결과에 회사 조직이 없었다. 키체인의 계정이 저장소가 속한 조직의 멤버가 아니었던 것이다.

왜 403이 아니라 404인가

GitHub는 권한이 없는 private 저장소에 403 대신 404를 돌려준다. 저장소가 존재한다는 사실 자체를 숨기기 위해서다. 그래서 실제로는 권한 문제인데 저장소가 없는 것처럼 보인다.

왜 이런 일이 생기나

URL에 사용자 이름이 없으면 credential helper는 github.com이라는 호스트 기준으로 자격 증명을 찾는다. 개인·회사 계정을 오가며 로그인하면 나중에 로그인한 계정이 이전 계정을 덮어쓰거나, 엉뚱한 저장소에 다른 계정으로 인증을 시도하게 된다.

해결: SSH 키 + Host 별칭으로 계정 분리

저장소마다 어떤 계정의 키로 인증할지 고정한다. GitHub 공식 문서의 다중 계정 안내에도 소개된 방법이다.

1. 계정 전용 SSH 키 생성

ssh-keygen -t ed25519 -C "work-account" -f ~/.ssh/id_ed25519_work
  • id_ed25519_work: 개인 키. 이 컴퓨터에만 두고 절대 공유하지 않는다(권한 600).
  • id_ed25519_work.pub: 공개 키. GitHub 계정에 등록한다.

패스프레이즈를 설정하고, macOS라면 ~/.ssh/config에 UseKeychain yes, AddKeysToAgent yes를 넣어 매번 입력하지 않게 하는 것을 권장한다.

2. 공개 키를 회사 계정에 등록

cat ~/.ssh/id_ed25519_work.pub의 내용을 회사 GitHub 계정의 Settings → SSH and GPG keys → New SSH key에 등록한다.

3. ~/.ssh/config에 별칭 추가

Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_work
    IdentitiesOnly yes

github-work는 실제 서버 주소가 아니라 내 SSH 설정 안에서만 통하는 별칭이다. SSH는 github-work로 접속하라는 요청을 받으면 "github.com에 id_ed25519_work 키로 접속"으로 바꿔 처리한다. IdentitiesOnly yes는 다른 키를 먼저 시도해 엉뚱한 계정으로 인증되는 것을 막는다.

4. remote URL을 별칭으로 변경

git remote set-url origin git@github-work:work-org/private-project.git

5. 연결 확인

ssh -T git@github-work
# Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.

이 메시지가 나오면 성공이다. GitHub는 셸 접근을 주지 않으므로 종료 코드가 1이어도 정상이다.

SSH 키 인증 원리

  1. git pull → SSH가 github-work(실제로는 github.com)에 접속
  2. config에 따라 id_ed25519_work 키 사용
  3. 서버가 인증용 데이터를 보내면, 로컬이 개인 키로 서명해 응답 (개인 키는 전송되지 않음)
  4. 서버가 등록된 공개 키로 서명을 검증하고, 그 공개 키의 주인 계정으로 인증

다른 방법

HTTPS를 유지하고 싶다면, URL에 사용자 이름을 넣어 credential helper가 계정별로 자격 증명을 구분하게 할 수 있다.

git remote set-url origin https://work-username@github.com/work-org/private-project.git

정리

항목변경 전변경 후
프로토콜HTTPSSSH
인증키체인의 토큰 (어느 계정인지 드러나지 않음)저장소별로 고정한 SSH 키
문제개인 계정 토큰이 쓰여 조직 저장소 접근 실패별칭으로 계정별 키를 명시

개인 계정으로 잘 동작하는 다른 저장소는 그대로 둬도 된다. 키체인 계정과 실제 접근해야 할 계정이 다른 저장소만 골라 바꾸면 된다.