Git을 사용할 때“오류 : 잘못된 색인 – 치명적 : 색인 파일 손상”을 해결하는 방법


611

이후 git init에는 몇 개의 파일을 추가 및 커밋하고 일부 변경 한 후 추가 및 커밋했습니다. git 데몬 (WinXP의 Cygwin에서 실행)을 설정하고 저장소를 한 번 복제했습니다. 이제 복제 된 저장소 에이 오류가 발생합니다.

$ git status
error: bad index file sha1 signature
fatal: index file corrupt

저장소의 새 사본을 얻는 것 외에이 문제를 해결할 수있는 방법이 있습니까?


복제 된 저장소 또는 원래 저장소에 있습니까? clone 명령이 오류를 출력 했습니까?
CB Bailey

답변:


1256

문제가 커밋에 대한 준비 영역 으로 인덱스에 문제가있는 경우 (예 :).git/index 인덱스를 제거하고 (원하는 경우 백업 복사본 만들기) 마지막 커밋에서 버전으로 인덱스를 복원하면됩니다.

OSX / Linux에서 :

rm -f .git/index
git reset

Windows에서 :

del .git\index
git reset

( reset위 의 명령은와 동일합니다 git reset --mixed HEAD)

또는 대신에 낮은 수준의 배관을 사용할 수 있습니다 .git read-treegit reset


문제가 packfile의 색인에있는 경우을 사용하여 복구 할 수 있습니다 git index-pack.


27
내가 실수를 한 :w!A의 :Gstatus(에서 fugitive.vim). 이 대답은 머리카락을 많이 절약했습니다.
Laurence Gonsalves 2012

5
"나도"메시지를 좋아하지 않지만 "나도"라는 메시지를 알고 있습니다. Windows와 동등한 것은 erase /s .git\index나도 필요했습니다 erase .git\index.lock.
Jeremy McGee 2016 년

1
안녕하세요, 찾기 및 바꾸기와 같은 문제가 있었지만 git reset은 .git / objects / pack /에 액세스 할 수없는 두 개의 팩 파일이 있다고 알려줍니다. 당신은 아이디어가 있습니까?
epsilones

13
git reset --keep대신 사용하는 것이 더 안전 하지 않습니까? 에서 타워 망할 놈의 치트 시트 가 같이 설명한다 : 커밋되지 않은 로컬 변경 사항을 커밋 이전에 HEAD 포인터를 재설정하고 유지
Pjetr

10
이 답변을 쓸 때 존재하지 않았습니다 ... 어쨌든 git reset --keep더 안전한 형태입니다 git reset --hard. git reset --mixedworkdir을 전혀 만지지 않습니다.
Jakub Narębski 2016 년

76

실수로 .git / index 파일을 프로젝트 루트의 sed (아마 리팩토링?)로 손상했을 수 있습니다.

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr "$SEARCHPATERN" "$PROJECTROOT")

나중에 이것을 피하려면 grep / sed로 바이너리 파일을 무시하십시오.

sed -ri -e "s/$SEACHPATTERN/$REPLACEMENTTEXT/g" $(grep -Elr --binary-files=without-match "$SEARCHPATERN" "$PROJECTROOT")

6
에서 변경 사항을 잃어 버릴 염려가 없다면 .git/index언제든지 삭제하고 다시 만들 수 있습니다 git reset( --hard! 없이 ).
Jakub Narębski

1
# find ./ -type f -exec sed -i 's / Politician / Legislator / g'{} \; 이 답변에서 권장하는 작업을 수행해도 처음에는 문제가 해결되지 않았지만 수락 된 답변은 내가 한 피해를 복구했습니다. 그러나 이것은 훌륭한 예방입니다.
Ryan Mortensen

1
@RyanMortensen 당신은 당신 이 너무 손상되어 작동하지 않을 경우 도움이 될 수 있습니다 sed와 같은 당신 으로 반전을 시도 할 수 있습니다 또는 기존 파일 을 삭제하지 않고 복원 할 수도 있습니다 . 물론 원래 코드 나 인덱스에 이미 "Legislator"가 있으면 실패합니다. find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \;.git/git reset.git/index
호브

1
@hobs 감사합니다. 많은 문제를 해결했습니다. – sed를 my new_string로 바꾸어 반전시켜 해결했습니다 old_string!
tsveti_iko

1
IntelliJ의 'src'폴더 대신 전체 프로젝트를 리팩터링 하고이 문제가 발생했습니다. 이것은 내가 왜 그런 이상한 오류가 있었는지 설명합니다!
Michael

18

나는 그 문제가 있었고, 이것으로 ti fix를 시도한다.

rm -f .git/index
git reset

그러나 그것은 작동하지 않았습니다. 해결책은 ? 어떤 이유로 하위 디렉토리에 다른 .git 폴더가 있습니다. 해당 .git 폴더 (주체 아님)를 삭제하고 git reset다시 삭제 합니다. 일단 삭제되면 모든 것이 다시 작동했습니다.


15

이것은 나쁜 클론처럼 들립니다. 더 많은 정보를 얻으려면 다음을 시도해보십시오.

git fsck --full

8

위의 솔루션으로 인해 계속 문제가 발생했기 때문에이 둔한 솔루션을 사용했습니다.

  1. 다른 곳의 리포지토리를 복제
  2. 새로운 .git 디렉토리를 커밋하려는 변경 사항이 포함 된 (깨진) 저장소에 복사하십시오.

트릭을 했어. Btw, sed@hobs가 짐작했던 것처럼 프로젝트 루트에서 작업했습니다. 내 수업을 배웠습니다.


훌륭합니다 :)
Jeremy Belolo 2012

복제 중이거나 분기를 생성했거나 복제 이후에 커밋을 발행했거나 다른 여러 시나리오가있는 경우 정말 훌륭하지 않습니다 ... 새로운 저장소 복제본을 복제하는 것은 거의 해결책이 아니며 저는 대담합니다. 그것은 조급함을 (다 (진정한 꼬집음에서 가장 왼쪽). 실제로 진행 상황을 진단하고 기존 리포지토리의 인덱스를 복구하는 것이 훨씬 좋습니다. 일반적으로 비교적 쉽습니다. 때때로 색인 파일의 이름을 바꾸거나 다시 필요하지 않다면 삭제하고 Git이 새로운 파일을 생성하도록 할 수도 있습니다 (git-reset 또는 git-checkout 사용).
Jazimov

7

이것은 나를 위해 일했습니다. 이유가 궁금하지만 처음부터 오류가 발생하기 시작했습니다. 어제 로그 아웃했을 때 문제가 없었습니다. 오늘 아침에 로그인하지 않았습니다.

rm .git/index

git reset

그것은 나를 위해 일했지만 git에서 추가 된 모든 파일을 제거했습니다. 나는 그 파일에 대한 자식 추가를 실행했다
샴술 Arefin Sajib에게

6

자식 서브 모듈 사용자를위한 참고 사항-여기의 솔루션은 그대로 작동하지 않습니다.

예를 들어라는 부모 dev저장소가 있고 하위 모듈 저장소가이라고 가정 해 봅시다 api.

당신이 안에 있고이 api질문에 언급 된 오류가 발생하면 :

error: bad index file sha1 signature fatal: index file corrupt

index파일은 내부되지 않습니다 .git폴더. 실제로 .git폴더도 아닙니다.이 저장소의 실제 .git 데이터 위치가있는 텍스트 문서가됩니다. 다음과 같은 것 같습니다.

~/dev/api $ cat .git gitdir: ../.git/modules/api

따라서 대신에 rm -f .git/index다음을 수행해야합니다.

rm -f ../.git/modules/api/index git reset

또는 더 일반적으로

rm -f ../.git/modules/INSERT_YOUR_REPO_NAME_HERE/index git reset


4

.git하위 디렉토리 중 하나 아래 에 디렉토리 가있는 경우이 문제가 발생할 수 있습니다 . 수정하려면 다른 .git 디렉토리가 있는지 확인하고 제거하고 다시 시도하십시오.


다른 정보가 이미이 정보를 제공했습니다.
Simon Forsberg

-1

나는 간단한 트릭을했다. 리포지를 새 폴더에 복제합니다. 새 폴더에서 .git 폴더를 복사하여 이전 폴더를 repo의 이전 폴더로 복사하여 .git을 대체합니다.


게시되지 않은 커밋, 태그 및 분기뿐만 아니라 숨김 및 재 로그와 같은 데이터를 삭제하기 때문에 매우 위험합니다.
Koraktor

게시되지 않은 커밋이 .git 폴더에 저장되어 있고 .git 폴더를 복사했다고 생각하기 때문에 확실하지 않습니다. 이 방법으로 아무것도 잃지 않았습니다. 나는 숨김에 대해 알지 못하고 그것에 대해 언급하기를 거부합니다.
아스트라 우 바로 바-토성의 별

정확하지만 로컬 복제를 수행했음을 강조해야합니다. 그러나 내 의견은 숨김 및 재확인에 대해서는 여전히 사실이 아닙니다.
Koraktor

좋아, 그 의견에 대한 경험이 더 이상 없지만, 나에게 도움이되었고 일부 사용자는 유용 할 수 있습니다. 공감할 필요가 없습니다.
아스트라 우 바로 바-토성의 별


-7

이것은 말도 안되지만 방금 내 컴퓨터 (mac)를 재부팅했으며 문제가 발생하지 않은 것처럼 사라졌습니다. 나는 지원 사람처럼 들리는 것을 싫어합니다 ...


-9

Windows OS를 사용하는 경우 파일의 이전 버전으로 복원을 시도 할 수도 있습니다.


1
당신이 모르는 대답을 넣지 마십시오.
Altaf Patel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.