Git 저장소 손상 (모형 헤더 검사, 자극 개체 손상)
어제 저녁 커밋 메시지를 작성하는 동안 정전이 발생했습니다. 머신 백업을 부팅했을 때 커밋을 완료 할 수 없습니다. 을 실행 git reset
하고 변경된 파일을 다시 추가 한 다음 다시 시도하여 다음을 얻었습니다.
% git commit
error: inflate: data stream error (incorrect header check)
error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header
fatal: a94406345ac44982b00cf57b4b9660a35436637f is not a valid object
git fsck
다음을 보여줍니다.
% git fsck --full
Checking object directories: 100% (256/256), done.
error: inflate: data stream error (incorrect header check)
error: unable to unpack 4346883490a0990e68db0187241abc1642765a73 header
error: inflate: data stream error (incorrect header check)
fatal: loose object 4346883490a0990e68db0187241abc1642765a73 (stored in .git/objects/43/46883490a0990e68db0187241abc1642765a73) is corrupt
나는 메시지가 다른 사람들에 대해 불평하고 있음을 알았습니다.
나는 SO와 웹을 검색하고 몇 가지 다른 것을 시도했지만 소용이 없었다.
- 최근 백업 사본이 없습니다.
- 저장소를 다른 디렉토리로 복제하는 것은 도움이되지 않습니다. 새 저장소는 똑같은 문제를 나타냅니다.
git stash
와 동일한 메시지가 제공git commit
됩니다. 작동하는 것입니다.
무엇이 잘못되었는지 확인하고 수정 비용을 지불해야합니까?
편집 : git log
제안 된대로 출력 (처음 몇 줄만) :
% git log --oneline --decorate --all |head -n 8
253b086 (HEAD, new_tokenize) Normalized tokenizer interface slightly
0f2425a (master) Added procs to eval layer
a4d4c22 Added procedures as a type
d1e15ad (tag: v0.10) Added `if' form with tail call semantics
f94a992 (tag: v0.9) Completed environments
031116e Fixed bug where # on a line by itself caused segfault
3d8b09f Added environments, define and set!
01cc624 Put symbol table implementation into types.c
이것은 작은 개인 프로젝트입니다. 나는 보통 (마스터)에서 일하지만 그 중에는 실험을하고 있습니다 (new_tokenize). 253b086은 정전 전에 마지막으로 성공한 커밋입니다.
git이 새 커밋을 위해 .git / objects에 파일을 생성합니다. 한 번에 하나씩 삭제하고 git fsck --full
다음 항목을 찾기 위해 다시 실행 하여 문제를 해결했습니다 . 처음보고 한 사람으로 시작했습니다 git fsck
.
% rm -f .git/objects/43/46883490a0990e68db0187241abc1642765a73
% git fsck --full
Checking object directories: 100% (256/256), done.
error: inflate: data stream error (incorrect header check)
error: unable to unpack 86e7247af5865e857a3b61eed99986e2d9538df1 header
error: inflate: data stream error (incorrect header check)
fatal: loose object 86e7247af5865e857a3b61eed99986e2d9538df1 (stored in .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1) is corrupt
% rm -f .git/objects/86/e7247af5865e857a3b61eed99986e2d9538df1
% git fsck --full
Checking object directories: 100% (256/256), done.
error: inflate: data stream error (incorrect header check)
error: unable to unpack a94406345ac44982b00cf57b4b9660a35436637f header
error: inflate: data stream error (incorrect header check)
fatal: loose object a94406345ac44982b00cf57b4b9660a35436637f (stored in .git/objects/a9/4406345ac44982b00cf57b4b9660a35436637f) is corrupt
등등. 내가 git fsck
만들려고했던 커밋의 5 개 파일에 해당하는 (내 생각대로) 정리 되기 전에 5 개의 개체를 삭제했습니다 . 파일 히스토리가 전혀 손상되지 않을 것입니다.
더 여서 저도 효과가있는 다른 방법을 생각했습니다. git clone
잘못된 개체를 복사하지만 복사 git push
합니다. 백업 후 새로운 빈 리포지토리를 생성하고 (그렇지 마스터로 푸시 할 수 없기 때문에 맨손으로) 변경 사항을 언 스테이징하고 두 브랜치를 새 리포지토리로 푸시했습니다. 그런 다음 다시 확인하고 백업에서 변경 사항을 복원하는 문제였습니다.
여기에서 누구도 밝히고 싶은 사람이 여전히 관심이 있습니다.
이 문제에 직면 한 모든 사람을위한이 질문에 대한 간단한 대답 : 원격 저장소가 있으면 원격 저장소가없는 경우 로컬 폴더에 복제하십시오 (손상된 로컬 저장소를 삭제 한 후) git clone 명령은 수정입니다. 손상된 저장소를 github에 푸시 한 다음 거기에서 복제하면 손상된 객체가 푸시되지 않고 문제가 해결 될 것이라고 생각합니다.
이 답변 에서 설명한대로 나는 다음을 실행했습니다.
git reflog expire --expire-unreachable=now --all
git gc --prune=now
내 매달려있는 blob과 매달려있는 커밋과 손상된 db 객체를 모두 제거했습니다.
하나씩 추적하는 것보다 훨씬 빠릅니다!
'ProgramingTip' 카테고리의 다른 글
주석을 지향하는 Java Aspect 지향 프로그래밍 (0) | 2020.11.28 |
---|---|
모바일 앱용 NoSQL? (0) | 2020.11.28 |
C / C ++ 소스 코드? (0) | 2020.11.28 |
정적 초기화 프로그램을 실행하지 않고 Java 클래스 경로에 클래스가 있는지 확인하십시오. (0) | 2020.11.28 |
RabbitMQ 대신 Celery를 사용하는 이유는 무엇입니까? (0) | 2020.11.28 |