Các tệp bị hỏng trong Git


8

Gần đây tôi đã xóa một số thư mục khỏi lịch sử git repos của mình bằng lệnh sau:

git filter-branch --index-filter 'git rm -r --cached var' -- --all

Thật không may, tôi không thể lấy thêm từ repos này, Đây là lỗi tôi đang gặp:

git pull
remote: Counting objects: 3953, done.
remote: Compressing objects: 100% (2810/2810), done.
error: garbage at end of loose object '4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0'
fatal: object 4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 is corrupted
fatal: index-pack failed

Trên hệ thống linux nào bạn đã thực hiện các thay đổi?
Andres Jaan Tack

Tôi đã sử dụng windows; Bây giờ tôi đang dùng linux và nó hoạt động tốt
mnml

Câu trả lời:


7

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:

  1. 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.

  2. 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
    
  3. 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.


LỚN cảm ơn bạn cho câu trả lời này. git-remove-trailing-garbage.py (liên kết của bạn với văn bản "đã viết một tập lệnh", ở trên) đã lưu thịt xông khói của tôi khi tôi gặp phải lỗi ecryptfs mà bạn đã đề cập!
Adam Monsen
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.