Một số linh hồn tốt bụng đã viết một kịch bản để thực hiện điều này một cách tự động (và kỹ lưỡng hơn), nhưng quá trình phục hồi về cơ bản là thế này:
Kiểm tra tệp báo cáo rác, với hexdump.
$ hexdump .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
Bạn đang tìm kiếm một phần của tập tin có một số không lớn. Nếu có nhiều nhịp như vậy, tôi đã có may mắn (N = 2) khi chỉ xem xét tập hợp số 0 khổng lồ đầu tiên, ngay cả khi chúng bao gồm các chuỗi dữ liệu khác không nhỏ. Đây là "rác" mà git đang phàn nàn.
...
0000500 0532 0302 0000 0000 0000 0000 0000 0000 # <-- Beginning here...
0000510 0000 0000 0000 0000 0000 0000 0000 0000
*
0001000 # ... almost 3kb of zeros.
Bạn có thể xác định từ đây kích thước thật của đối tượng. Ở đây, nó sẽ là 0x504 hoặc 1.284 byte.
Tạo một bản sao lưu của đối tượng. Trong trường hợp bạn chọn sai số không, bạn có thể thử lại với một bộ khác.
$ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
Cắt ngắn tập tin theo chiều dài thích hợp của nó.
$ truncate -s 1284 .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
Các đối tượng tham nhũng nên được sửa chữa. Giả sử nó là duy nhất, nhân bản / đẩy / kéo kho lưu trữ bây giờ sẽ hoạt động như mong đợi.
Trích dẫn nguồn của tôi, tôi tin rằng tôi đã gặp vấn đề tương tự, nhưng trong trường hợp của tôi sử dụng Ubuntu 10.4 (kernel 2.6.32-23-generic). Trong trường hợp này, đó là một lỗi hệ thống tập tin chưa được theo dõi. Có một vấn đề mở về ecryptfs về chủ đề này và cũng là một chủ đề usenet liên quan . Trên đường đến một giải pháp, tôi tìm thấy một câu trả lời và tóm tắt hữu ích trên StackOverflow. Các bài viết liên quan là rất thú vị, mặc dù tôi cuối cùng đã đi theo một cách khác.