손상되었거나 부분적으로 삭제된 Git 저장소를 복구하는 방법

손상되었거나 부분적으로 삭제된 Git 저장소를 복구하는 방법

실수로 rm -r.git 디렉토리에서 하나를 실행했습니다. 운 좋게도 rm쓰기 금지된 파일에 도달했을 때 중지되었지만 여전히 .git에서 일부 내용이 손실되었습니다.

아직 가지고 있는 파일은 다음과 같습니다.

FETCH_HEAD
ORIG_HEAD
config
gitk.cache
logs/
objects/

내 누락된 파일:

HEAD
description
hooks/
index
info/
packed-refs
refs/

내가 아는 한, 내가 잃어버린 것 중 다시 복제할 수 없는 유일한 것은 대기 장소와 심판 교체뿐입니다. 스테이징 변경 사항을 잃을 준비가 되었지만 HEAD와 분기를 복원해야 합니다. 이를 수행할 수 있는 방법이 있습니까? 예를 들어, 자식이 없는 커밋을 찾아서 커밋이 무엇인지 확인하고 브랜치를 생성하면 어떨까요? 현재 git은 더 이상 내 저장소를 저장소로 인식하지 않습니다.

답변1

objects모든 커밋과 참조 파일은 디렉터리 에 개체로 저장됩니다 . Git은 읽기 전용으로 생성했으므로 계속 존재해야 합니다.

objects복구하려면 빈 저장소를 새로 만들고 손상된 저장소 디렉터리의 내용을 새 저장소의 디렉터리에 복사하는 것이 좋습니다 . 이렇게 하면 git이 최소한 저장소임을 인식하고 모든 개체를 갖게 되는 지점에 도달하게 됩니다. 복사본을 사용하면 문제를 해결하려고 할 때 추가 손상을 방지하는 데도 도움이 됩니다.

임시 저장소를 생성하고 객체를 복사하는 셸 명령:

git init /tmp/recovery
cd /tmp/recovery
cp -r /path/to/broken/repo/.git/objects .git

완료되면 이를 사용하여 git fsck어떤 것에서도 참조되지 않는 개체 목록을 얻을 수 있습니다. 여기에는 모든 브랜치 헤드뿐만 아니라 git commit --amend리베이스 또는 리베이스로 인해 더 이상 사용되지 않는 커밋도 포함되어야 합니다.

여전히 로그 디렉터리가 있으므로 이는 훨씬 더 도움이 될 수 있습니다. logs/refs/heads/<branch>보유한 각 분기에 대한 파일이 있어야 합니다. 마지막 행의 두 번째 열에는 삭제가 완료되었을 때 분기의 선두에 있었던 커밋의 ID가 포함됩니다. HEAD가 어디에 있는지에 대한 정보 도 동일해야 logs/HEAD하지만, 분리된 HEAD를 사용하지 않았다면 그냥 브랜치를 복원한 다음 정상적으로 브랜치를 확인하는 것이 좋습니다.

되돌리려는 각 분기에 대해 다음을 실행할 수 있습니다.

git branch <name> <commit_id>

브랜치를 되돌린 후 구성 파일을 복사할 수 있으며 최근 커밋 위치와 매우 가까워야 합니다.

관련 정보