포스트

gh repo create --push에서 저장소만 생성되고 Push가 실패할 때

gh CLI의 API 인증과 Git의 SSH/HTTPS 인증이 서로 다른 계층이라는 점에서 repo 생성은 성공하지만 push만 publickey 오류로 실패하는 원인과 해결 방법을 정리한다.

gh repo create --push에서 저장소만 생성되고 Push가 실패할 때

gh repo create --source=. --push를 실행했는데 GitHub에는 저장소가 생성되고 마지막 push만 실패할 수 있다.

1
2
3
Repository 생성  → 성공
Remote 설정      → 성공
Git Push         → 실패

겉으로는 하나의 gh 명령이지만 내부에서는 GitHub API 인증과 Git 전송 인증이 서로 다른 계층을 사용하기 때문이다.

증상

1
gh repo create my-repo --public --source=. --remote=origin --push

실행 후 다음 오류가 나타난다.

1
2
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

그런데 GitHub 웹에서는 이미 repository가 생성되어 있고 로컬 origin도 존재한다.

원인 — gh 인증과 Git 인증을 분리해서 본다

전체 흐름을 나누면 이해하기 쉽다.

1
2
3
4
5
6
7
8
9
10
11
12
13
gh repo create
   │
   ├─ GitHub API 호출
   │    ↓
   │   gh의 로그인 Credential
   │    ↓
   │   Repository 생성
   │
   └─ git push
        ↓
      Remote URL의 Protocol
        ├─ SSH   → SSH Key 인증
        └─ HTTPS → Credential Helper/Token 인증

gh auth login이 성공했다는 사실만으로 SSH push까지 자동으로 성공하는 것은 아니다.

Git 작업 protocol을 SSH로 선택해 origin이 다음 형태라면:

1
git@github.com:<user>/<repo>.git

실제 push 인증은 SSH가 담당한다. GitHub에 등록된 적절한 SSH key가 없거나 현재 SSH 설정이 그 key를 사용하지 못하면 repository 생성과 무관하게 push가 실패한다.

확인

먼저 gh 로그인 상태를 확인한다.

1
gh auth status

그다음 remote가 어떤 protocol인지 확인한다.

1
git remote -v

SSH라면 실제 SSH 인증도 별도로 확인한다.

1
ssh -T git@github.com

즉 문제를 다음 두 질문으로 나누면 된다.

1
2
3
4
5
GitHub API 호출이 되는가?
→ gh auth 상태

Git Remote에 Push할 수 있는가?
→ Remote Protocol + 해당 Protocol의 Credential

해결 1 — SSH를 계속 사용한다

SSH가 목적이라면 올바른 key를 생성·등록하고 현재 GitHub host가 그 key를 사용하도록 설정한다.

여러 GitHub 계정을 함께 쓴다면 Host alias를 사용하는 방법은 GitHub 다중 계정 — SSH 인증과 Commit Identity를 분리해서 관리하기에서 다룬다.

인증 확인:

1
ssh -T git@github.com

정상이라면 다시 push한다.

1
git push -u origin main

해결 2 — HTTPS와 gh Credential을 사용한다

SSH key를 별도로 관리하지 않으려면 remote를 HTTPS로 바꿀 수 있다.

1
2
3
git remote set-url origin https://github.com/<user>/<repo>.git
gh auth setup-git
git push -u origin main

gh auth setup-git은 Git이 HTTPS credential을 요청할 때 gh의 credential helper를 사용할 수 있게 설정한다.

1
2
3
4
5
6
7
Git Push
  ↓ HTTPS
Git Credential Helper
  ↓
gh Credential
  ↓
GitHub

왜 Repository만 남았나

이 현상은 rollback되지 않은 중간 상태로 이해하면 된다.

1
2
3
1. GitHub API로 Repository 생성   ← 이미 성공
2. origin Remote 구성             ← 성공
3. git push                        ← SSH 인증 실패

3번이 실패했다고 1번에서 생성한 GitHub repository가 자동 삭제되는 것은 아니다.

따라서 다시 gh repo create부터 반복하기보다 기존 repository와 remote를 유지한 채 push 인증만 고치면 된다.

관련 있지만 별도 문제 — Token 권한

GitHub API의 특정 작업이 실패한다면 그때는 token 권한 문제를 본다. 예를 들어 추가 권한이 필요한 작업은 gh auth refresh로 필요한 scope를 요청할 수 있다.

하지만 Permission denied (publickey)는 token scope 문제가 아니다.

1
2
3
4
5
publickey 오류
→ SSH 인증 계층

GitHub API 권한 오류
→ gh Credential / Token 권한 계층

두 문제를 섞지 않는 것이 중요하다.

정리

1
2
3
4
5
6
7
8
gh 로그인 성공
≠ 모든 Git 전송 인증 성공

GitHub API 인증
→ Repository 생성 등

Git Remote 인증
→ SSH 또는 HTTPS Push/Pull

gh repo create --push에서 repository만 생성되고 push가 실패한다면 명령 전체를 하나로 보지 말고 어느 단계까지 성공했는지 먼저 분리하면 원인을 빠르게 찾을 수 있다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.