[Git] clone 시 Repository not found 에러

⚠️ 에러

remote: Repository not found
fatal: repository [저장소 주소] not found

어느날부터 git clone을 할 때마다 이런 에러가 뜨기 시작했다.

인증 관련 에러겠거니 하고 그때그때 구글링해서 해결했었는데 이제는 메모를 해놓으려고 한다.

우선 원인 분석을 위해 다음을 테스트 해보았다.


  1. git config --global 설정
  2. 키체인에서 github 관련 암호 삭제
  3. git clone https://[사용자명]@github.com/~
  4. git remote [저장소 주소]
  5. git remote set-url origin https://[사용자명]@github.com/~

이 중 효과가 있었던 항목은 볼드체로 표시해 두었다. (사실 중요하진 않음)

처음에는 git config가 문제인 줄 알고 이리저리 수정해 보았지만 사실 config 정보는 clone이나 push시에는 사용되지 않는다. 이는 커밋할 때 Git 로그에 기록되는 이름과 이메일을 설정하는 용도이다. 따라서, 사실 그리 중요하지 않은 정보이다.

3번과 5번은 대표적인 성공 사례인데, 잘 보면 둘 다 github.com 앞에 사용자명과 @를 추가해준 것을 볼 수 있다. 매번 저렇게 하는 것은 귀찮을테니 우리는 근본적인 해결책을 찾아야한다.

재미있는 점은 사실 @ 앞에 랜덤한 문자열을 붙여도 그대로 정상 동작이 된다는 것이다!

이를 이해하려면 Git의 자격 증명에 대해서 자세히 알 필요가 있다.

📍 원인: Git 자격 증명 캐시가 남아있음

GitHub가 Personal Access Token (PAT) 방식으로 인증 방식을 변경한 것은 다들 알고 있을테고, Git은 credential.helper를 통해 이러한 자격 증명을 캐싱하는데 (특히 store 방식), 여기서 만료된 토큰이나 다른 계정의 자격 증명이 캐싱되어 있을 확률이 높다.

더군다나, Git은 @ 앞의 문자열을 단순한 “사용자명”으로 해석하고, 실제 인증은 다른 방식으로 진행하기 때문에 사실상 기존에 캐싱된 정보와 완전히 동일한 사용자명이 아니기만 하면 이전에 캐싱되어 있던 자격 증명을 쓰지 않고 새로운 증명을 요구하게 된다. (물론 아무것도 입력하지 않은 것도 사용자명으로 간주한다.)

💡 해결

echo "url=https://github.com" | git credential reject

이렇게 하면 Git이 저장된 자격 증명을 삭제하고 새로운 토큰을 요구하게 된다.

아래의 명령어로 현재 저장된 자격 증명을 볼 수 있다.

cat ~/.git-credentials

⛱️ 정리

  • Repositoy Not Found 에러는 Git에 잘못된 토큰 정보가 캐시되어 있어서 나타난다.
  • github.com 앞에 사용자명 + @를 붙이는 것은 일시적인 해결책이 될 수 있지만 근본적인 해결책은 아니다.
  • 사용자명은 인증 시에 중요하게 사용되지 않는다. 새로운 캐시를 만들 뿐…

캐시를 삭제해준 뒤에 다시 git clone을 사용하게 되면 새로운 토큰을 요구할 것이고 정상적으로 인증된다면 해당 정보가 새롭게 캐시되어 이후 git 명령어 사용시에 자동으로 활용된다는 것이다. 사용자가 지정되지 않은 바닐라 github.com 주소 관련 캐시에 유효한 토큰이 저장되어 있는지가 중요하다.