에러 상황: "Unsupported packed-refs format. Missing 'fully-peeled' header"
새로운 프로젝트를 생성하고 열심히 코드를 작성한 뒤, fork 클라이언트를 사용해 GitHub에 코드를 올리려고 했습니다. 하지만 다음과 같은 에러 메시지가 나타났습니다:
Unsupported packed-refs format. Missing 'fully-peeled' header
이 에러는 처음 보는 메시지라 바로 구글링을 통해 해결책을 찾기 시작했습니다. 다행히도 동일한 문제를 겪었던 사람들이 공유한 해결 방법을 찾을 수 있었습니다.
참고 사이트
https://github.com/fork-dev/TrackerWin/issues/2266
Git Error at startup: Failed to read references from '%USERPROFILE%\git\my-project\.git': Unsupported packed-refs format. Missin
When starting Fork, I've a "Git Error" modal dialog with an error message of the kind: Failed to read references from '%USERPROFILE%\git\my-project\.git': Unsupported packed-refs format. Missing 'f...
github.com
해결
해당 프로젝트에 git bash를 열어 아래 명령어를 실행했습니다.
git pack-refs
바로 해결이 되었습니다.
원인 추측
- 프로젝트에 main과 develop브랜치가 생성된 상태
Eclipse와 GitHub 연동이 잘되지 않는 것 같아 프로젝트를 다시 연결했습니다. 이 과정에서
1. GitHub 사이트에서 메인 브랜치를 main에서 develop 브랜치로 변경했습니다.
2. 하지만 제가 가지고 있는 로컬 프로젝트의 메인 브랜치는 여전히 main이었습니다.
3. 이 과정에서 main 브랜치가 누락된 부분이 문제가 되었을 가능성이 있습니다.
즉, 브랜치를 변경하는 과정에서 "packed-refs" 파일이나 참조 정보가 깨졌을 가능성이 높아 보입니다.
좀 더 깊게 생각해보면
1. 브랜치 변경 과정에서 "packed-refs" 파일 갱신 실패
Git은 브랜치와 태그 정보를 refs 디렉토리나 packed-refs 파일에 저장합니다.
- main 브랜치를 develop 브랜치로 변경하는 과정에서:
- main 브랜치에 대한 참조(ref)가 삭제되었거나,
- 새로운 브랜치 정보(develop)가 packed-refs에 제대로 반영되지 않았을 가능성이 있습니다.
------
2. 메인 브랜치 누락
Git은 기본적으로 HEAD를 통해 현재 체크아웃된 브랜치를 가리킵니다.
- 원래 메인 브랜치가 main으로 설정되어 있었는데,
- 브랜치를 develop으로 변경한 뒤
- 기존의 main 브랜치를 삭제하거나 제대로 갱신하지 못했다면,
- Git은 HEAD에서 가리키는 브랜치를 찾을 수 없어서 에러가 발생할 수 있습니다.
결과적으로, main 브랜치 정보가 누락되면서 packed-refs 파일이 불완전해진 것이 문제가 되었을 가능성이 높다고 생각됩니다.
git pack-refs
해당 명령어가 어떤 역할을 하는지 GPT에게 물어봤습니다.
`git pack-refs` 명령어는 Git에서 참조(ref) 정보를 최적화된 형태로 압축(pack) 하기 위해 사용됩니다. Git은 브랜치나 태그 같은 참조 정보를 `refs` 디렉토리의 개별 파일로 저장하거나, 성능 최적화를 위해 packed-refs 파일로 압축 저장합니다.
언제 사용해야 할까?
1. 대규모 프로젝트 : 브랜치와 태그가 많은 대규모 프로젝트에서 성능을 개선하고 싶을 때.
2. 저장소 관리 최적화 : Git 저장소의 참조 관리가 느려졌거나, 디스크 I/O를 줄이고 싶을 때.
3. 수동으로 참조 갱신이 필요할 때 : 참조 정보가 깨졌거나, packed-refs와 refs 간의 불일치 문제가 있을 때.
주의사항은?
일반적으로 Git은 참조 정보를 자동으로 관리하므로, 직접 git pack-refs를 실행할 필요는 거의 없습니다. 잘못된 사용으로 인해 참조가 손상될 수 있으므로, 반드시 백업 후 실행하는 것이 좋습니다.
요약하자면,git pack-refs 명령어는 Git에서 참조(ref) 정보를 최적화된 형태로 압축(pack) 하기 위해 사용됩니다. Git은 브랜치나 태그 같은 참조 정보를 refs 디렉토리의 개별 파일로 저장하거나, 성능 최적화를 위해 packed-refs 파일로 압축 저장합니다.
뭐든지 처음보는 명령어를 실행해야할 땐 백업 필수입니다.!
해당 내용에 틀린 정보가 있다면, 정보 공유주시면 감사하겠습니다!