Cách giải quyết Lỗi Lỗi: chỉ mục xấu - Gây tử vong: tệp chỉ mục bị hỏng khi sử dụng Git


611

Sau đó git init, tôi đã thêm và cam kết một vài tệp, thực hiện một số thay đổi, thêm và cam kết. Thiết lập trình nền git (chạy dưới Cygwin trên WinXP) và nhân bản kho lưu trữ một lần. Bây giờ, tôi gặp lỗi này với kho lưu trữ nhân bản:

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

Có cách nào để khắc phục điều này, ngoài việc lấy một bản sao mới của kho lưu trữ không?


Đây là trong kho lưu trữ nhân bản, hoặc trong kho lưu trữ ban đầu? Lệnh clone có xuất ra lỗi nào không?
CB Bailey

Câu trả lời:


1257

Nếu sự cố xảy ra với chỉ mục là khu vực tổ chức cho các xác nhận (nghĩa là .git/index), bạn chỉ cần xóa chỉ mục (tạo bản sao lưu nếu bạn muốn), sau đó khôi phục chỉ mục về phiên bản trong lần xác nhận cuối cùng:

Trên OSX / Linux:

rm -f .git/index
git reset

Trên Windows:

del .git\index
git reset

( resetLệnh trên giống như git reset --mixed HEAD)

Bạn có thể thay thế sử dụng hệ thống ống nước cấp thấp hơn git read-treethay vì git reset.


Nếu vấn đề với chỉ mục cho packfile , bạn có thể khôi phục nó bằng cách sử dụng git index-pack.


27
Tôi đã vô tình làm một :w!trong một :Gstatus(từ fugitive.vim). Câu trả lời này đã giúp tôi tiết kiệm rất nhiều tóc.
Laurence Gonsalves

5
Tôi biết chúng tôi không thích tin nhắn "tôi cũng vậy" - nhưng "tôi cũng vậy". Tương đương trong Windows là erase /s .git\index, tôi cũng cần erase .git\index.lock.
Jeremy McGee

1
Xin chào, tôi gặp vấn đề tương tự với tìm và thay thế nhưng git reset cho tôi biết có hai tệp gói trong .git / object / pack / không thể truy cập được. Bạn có một ý tưởng ?
epsilones

13
git reset --keepthay vào đó sẽ an toàn hơn khi sử dụng ? Trong Tower Git Cheat Sheet, nó được giải thích là: Đặt lại con trỏ CHÍNH của bạn về một cam kết trước đó và duy trì các thay đổi cục bộ không được cam kết
Pjetr

10
Nó không tồn tại khi tôi viết câu trả lời này ... Dù sao thì đó git reset --keeplà hình thức an toàn hơn git reset --hard; git reset --mixedhoàn toàn không chạm vào workdir.
Jakub Narębski

76

Bạn có thể đã vô tình làm hỏng tệp .git / index với một sed trên gốc dự án của bạn (có thể tái cấu trúc?) Với một cái gì đó như:

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

để tránh điều này trong tương lai, chỉ cần bỏ qua các tệp nhị phân với grep / sed của bạn:

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

6
Nếu bạn không nhớ mất các thay đổi .git/index, bạn luôn có thể xóa nó và tạo lại bằng git reset(không có --hard!).
Jakub Narębski

1
Tôi đã phá vỡ nó bằng # find ./ -type f -exec sed -i 's / Chính trị gia / Nhà lập pháp / g' {} \; Làm những gì câu trả lời này khuyến nghị điều này sẽ không phá vỡ nó ngay từ đầu, nhưng câu trả lời được chấp nhận đã sửa chữa những thiệt hại mà tôi đã làm. Đây là phòng ngừa tuyệt vời mặc dù.
Ryan Mortensen

1
@RyanMortensen Bạn có thể thử đảo ngược của bạn sedvới một cái gì đó như find .git/ -type f -exec sed -i 's/Legislator/Politician/g' {} \; Điều này có thể giúp đỡ nếu bạn .git/bị hỏng mà git resetkhông hoạt động. Hoặc có thể bạn muốn khôi phục lại hiện tại của bạn .git/indexmà không xóa nó. Tất nhiên, điều này sẽ thất bại nếu mã hoặc chỉ mục gốc của bạn đã có một số "Nhà lập pháp" trong đó.
hobs

1
Cảm ơn bạn @hobs bạn đã cứu tôi rất nhiều rắc rối - Tôi đã giải quyết nó bằng cách đảo ngược sedbằng cách thay thế của tôi new_stringbằng của tôi old_string!
tsveti_iko

1
Tôi đã cấu trúc lại toàn bộ dự án của mình thay vì thư mục 'src' trong IntelliJ và gặp vấn đề này. Điều này giải thích tại sao tôi có những lỗi kỳ lạ như vậy!
Michael

18

Tôi đã có vấn đề đó, và tôi cố gắng sửa chữa với điều này:

rm -f .git/index
git reset

NHƯNG nó không hoạt động. Giải pháp ? Vì một số lý do, tôi đã có các thư mục .git khác trong các thư mục phụ. Tôi xóa các thư mục .git (không phải hiệu trưởng) và git resetmột lần nữa. Một khi chúng bị xóa, mọi thứ lại hoạt động.


15

Điều này nghe giống như một bản sao xấu. Bạn có thể thử các cách sau để có thêm (có thể?) Thông tin thêm:

git fsck --full

8

Vì các giải pháp trên khiến tôi gặp vấn đề liên tục, tôi đã sử dụng giải pháp buồn tẻ này:

  1. sao chép một bản sao mới của repo ở nơi khác
  2. sao chép thư mục .git mới vào repo (bị hỏng) có chứa các thay đổi tôi muốn cam kết

Đã lừa Btw, tôi đã thực hiện một seddự án gốc như @hobs đoán. Đã học bài học của tôi.


Thật tuyệt vời :)
Jeremy Belolo

Sẽ không thực sự xuất sắc nếu bạn ở giữa một sự hợp nhất, đã tạo ra các chi nhánh hoặc đã đưa ra bất kỳ cam kết nào kể từ khi nhân bản, hoặc bất kỳ kịch bản nào khác ... Nhân bản một bản sao mới của repo hầu như không phải là một giải pháp và tôi không dám nó thiếu kiên nhẫn (tốt nhất còn lại khi ở trong một nhúm thực sự). Thật tốt hơn nhiều khi thực sự chẩn đoán những gì đang diễn ra và sửa chữa chỉ số của repo hiện tại - điều đó thường tương đối dễ thực hiện. Đôi khi bạn chỉ có thể đổi tên tệp chỉ mục (hoặc xóa nó, nếu bạn chắc chắn rằng mình sẽ không bao giờ cần đến nó nữa) và để Git tạo một tệp mới (sử dụng git-reset hoặc git-checkout) ..
Jazimov

7

Điều này làm việc cho tôi. Mặc dù tôi tò mò về lý do tôi bắt đầu nhận được lỗi ngay từ đầu. Khi tôi đăng xuất ngày hôm qua, nó vẫn ổn. Đăng nhập vào sáng nay, nó đã không.

rm .git/index

git reset

Điều này làm việc cho tôi, mặc dù Nó đã xóa tất cả các tệp được thêm vào từ git. Tôi đã phải chạy git add cho các tệp đó
Shamsul Arefin Sajib

6

Lưu ý cho người dùng mô đun con git - các giải pháp ở đây sẽ không hoạt động cho bạn như hiện tại.

Giả sử bạn có một kho lưu trữ cha được gọi dev, ví dụ, và kho lưu trữ mô hình con của bạn được gọi api.

nếu bạn ở trong apivà bạn gặp lỗi được đề cập trong câu hỏi này:

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

Các indextập tin sẽ KHÔNG nằm trong một .gitthư mục. Trên thực tế, .gitthậm chí sẽ không phải là một thư mục - nó sẽ là một tài liệu văn bản với vị trí của dữ liệu .git thực cho kho lưu trữ này. Có khả năng một cái gì đó như thế này:

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

Vì vậy, thay vì rm -f .git/index, bạn sẽ cần phải làm điều này:

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

hoặc, nói chung hơn,

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


4

Vấn đề này có thể xảy ra khi có một .gitthư mục bên dưới một trong các thư mục con. Để khắc phục, hãy kiểm tra xem có thư mục .git nào khác không, và xóa chúng và thử lại.


Một số câu trả lời khác đã cung cấp thông tin này.
Simon Forsberg

-1

Tôi đã làm một mẹo đơn giản. Tôi sao chép repo vào một thư mục mới. Sao chép thư mục .git từ thư mục mới sang thư mục cũ của repo, thay thế .git ở đó.


Rất nguy hiểm vì nó sẽ xóa dữ liệu như các cam kết, thẻ và chi nhánh chưa được công bố cũng như stash và reflog.
Koraktor

Không chắc chắn về các cam kết chưa được công bố vì tôi tin rằng chúng được lưu trữ trong thư mục .git và tôi đã sao chép thư mục .git. Tôi đã không mất bất cứ điều gì với phương pháp này. Tôi không biết về stash và reflog để đưa ra bất kỳ bình luận nào về điều đó.
Astra Uvarova - ngôi sao của sao Thổ

Bạn đã đúng, nhưng có lẽ bạn nên nhấn mạnh rằng bạn đã làm một bản sao địa phương. Nhưng bình luận của tôi ist vẫn đúng cho stash và reflog.
Koraktor

Được rồi, tôi không có bất kỳ kinh nghiệm nào về nhận xét đó thêm nữa, tuy nhiên, nó hoạt động với tôi và một số người dùng có thể thấy nó hữu ích. Không cần phải downvote nó.
Astra Uvarova - Ngôi sao của Sao Thổ ngày


-7

Điều này thật nực cười nhưng tôi vừa khởi động lại máy (mac) và vấn đề đã biến mất như chưa từng xảy ra. Tôi ghét âm thanh như một người hỗ trợ ...


-9

Bạn cũng có thể thử khôi phục lại phiên bản trước của tệp (nếu bạn đang sử dụng windows os)


1
Đừng đặt câu trả lời mà bạn không biết.
Altaf Patel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.