2010-11-06 25 views
46

Tôi đã làm một git pull khi tôi đã gần hạn ngạch của tôi, và kết quả là (vì vậy tôi nghĩ), có một tập tin bị hỏng:Làm cách nào để xử lý các tệp đối tượng bị hỏng?

$ git pull 
walk dffbfa18916a9db95ef8fafc6d7d769c29a445aa 
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted 

$ git fsck --full 
bad sha1 file: .git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp 
fatal: object d4a0e7599494bfee2b5351113895b43c351496b3 is corrupted 

$ git cat-file -t d4a0e7599494bfee2b5351113895b43c351496b3 
error: unable to find d4a0e7599494bfee2b5351113895b43c351496b3 
fatal: git cat-file d4a0e7599494bfee2b5351113895b43c351496b3: bad file 

Làm thế nào tôi có thể giải quyết tham nhũng này?

.git/objects/66/b55c76947b1d38983e0944f1e6388c86f07a1b.temp là 0 byte; xóa nó không làm gì để giải quyết vấn đề của tôi (cùng một lỗi).

+0

Nội dung phải sha1 tổng cho tên tệp. Không có cách nào để khôi phục nội dung dựa trên băm, vì vậy trừ khi git có một số loại dự phòng được tích hợp cho tình huống chính xác này (tôi không thể nói nó không) Tôi muốn nói bạn cần tìm nạp lại hoặc sao chép từ xa một lần nữa. – meagar

+0

Bạn nói bạn đã xóa nó - bạn có thử kéo lại sau đó không? Một đối tượng tạm thời kích thước bằng không của một lần chuyển bị hủy bỏ ... – Cascabel

+0

Đầu ra của 'tìm. -name d4a0e7599494bfee2b5351113895b43c351496b3' là không có gì. Xóa tệp sha1 sau đó chỉ kéo kết quả trong tệp sha1 trống đang được tạo. – Mike

Trả lời

31

Nói chung, việc sửa các đối tượng tham nhũng có thể khá khó khăn. Tuy nhiên, trong trường hợp này, chúng tôi tin rằng vấn đề là chuyển giao bị hủy bỏ, có nghĩa là đối tượng nằm trong kho lưu trữ từ xa, vì vậy chúng tôi có thể xóa an toàn bản sao của chúng tôi và để git lấy nó từ xa. .

Tệp đối tượng tạm thời, có kích thước bằng 0, rõ ràng chỉ có thể bị xóa. Nó sẽ không làm chúng ta tốt. Các đối tượng tham nhũng mà đề cập đến nó, d4a0e75..., là vấn đề thực sự của chúng tôi. Nó có thể được tìm thấy trong .git/objects/d4/a0e75.... Như tôi đã nói ở trên, nó sẽ được an toàn để loại bỏ, nhưng chỉ trong trường hợp, sao lưu nó lên đầu tiên.

Tại thời điểm này, git pull mới sẽ thành công.

... giả định nó sẽ thành công ngay từ đầu. Trong trường hợp này, có vẻ như một số sửa đổi cục bộ đã ngăn việc hợp nhất đã cố gắng, do đó, stash, pull, stash pop đã được sắp xếp. Điều này có thể xảy ra với bất kỳ hợp nhất, mặc dù, và không có bất cứ điều gì để làm với các đối tượng bị hỏng. (Trừ khi có một số chỉ mục dọn dẹp cần thiết, và stash đã làm điều đó trong quá trình ... nhưng tôi không tin như vậy.)

+1

Điều này có thể dẫn đến 'lỗi: refs/heads/branch không trỏ đến một đối tượng hợp lệ!'. Đảm bảo sao lưu. –

5

Recovering from Repository Corruption là câu trả lời chính thức.

câu trả lời ngắn gọn là: tìm các đối tượng không bị hỏng và sao chép chúng.

+2

Điều này không đặc biệt hữu ích. Các đối tượng tham nhũng trong câu hỏi là gần như chắc chắn không phải là một trong những nhu cầu phục hồi; đó là một phần được lấy một phần từ xa. – Cascabel

+0

Đây là cách duy nhất, đó là hữu ích cho tôi !!!! Cảm ơn lớn))) –

15

bạn có thể sử dụng "tìm" để xóa tất cả các tệp trong thư mục/đối tượng với 0 kích thước với lệnh find .git/objects/ -size 0 -delete. Sao lưu được khuyến khích.

+0

hmm, đã giúp, sau khi tạm ngưng tôi đã có một vài đối tượng trống và loại bỏ chúng cho phép tôi lấy các đối tượng thực từ repo từ xa. May mắn thay tôi đã đẩy ngay trước khi đình chỉ. Tuy nhiên, để xem những gì đang xảy ra với các tập tin tôi đã không cam kết được nêu ra, hy vọng họ đã được đồng bộ hóa với đĩa trước khi đình chỉ. CẢNH BÁO, hãy lưu các băm bạn xóa tốt hơn nếu cần kiểm tra thêm. – akostadinov

Các vấn đề liên quan