File rusak di Git

8

Saya baru-baru ini menghapus beberapa folder dari riwayat repositori git saya menggunakan perintah berikut:

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

Sayangnya saya tidak dapat menarik lagi dari repo ini, Ini adalah set kesalahan yang saya dapatkan:

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
mnml
sumber
Di sistem linux mana Anda membuat perubahan?
Andres Jaan Tack
Saya menggunakan windows; sekarang saya di linux dan bekerja dengan baik
mnml

Jawaban:

7

Seseorang yang baik hati menulis sebuah skrip untuk melakukan ini secara otomatis (dan lebih teliti), tetapi proses pemulihan pada dasarnya adalah ini:

  1. Periksa file yang melaporkan sampah, dengan hexdump.

    $ hexdump .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    

    Anda sedang mencari bagian dari file di mana ada sejumlah besar nol. Jika ada beberapa rentang seperti itu, saya sudah beruntung (N = 2) ketika mempertimbangkan hanya set nol pertama raksasa, bahkan ketika mereka memasukkan data kecil bukan nol. Ini adalah "sampah" yang dikeluhkan git.

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

    Dari sini Anda dapat menentukan ukuran sebenarnya dari objek. Di sini, itu akan menjadi 0x504 atau 1.284 byte.

  2. Buat salinan cadangan objek. Jika Anda memilih set nol yang salah, Anda dapat mencoba lagi dengan set yang berbeda.

    $ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    
  3. Pangkas file hingga panjang yang sesuai.

    $ truncate -s 1284 .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    

Objek yang korup sekarang harus diperbaiki. Dengan asumsi itu satu-satunya, mengkloning / mendorong / menarik repositori sekarang akan berfungsi seperti yang diharapkan.

Mengutip sumber saya, saya percaya saya telah mengalami masalah yang sama, tetapi dalam kasus saya menggunakan Ubuntu 10.4 (kernel 2.6.32-23-generic). Dalam hal ini, ini adalah bug sistem file yang belum dilacak. Ada masalah terbuka pada ecryptfs pada subjek ini dan juga utas usenet terkait . Sepanjang jalan menuju solusi, saya menemukan jawaban dan ringkasan berguna di StackOverflow. The artikel terkait sangat menarik, meskipun saya akhirnya pergi dengan cara yang berbeda.

Andres Jaan Tack
sumber
BESAR terima kasih atas jawaban ini. git-remove-trailing-garbage.py (tautan Anda dengan teks "tulis skrip", di atas) menyelamatkan daging saya ketika saya menemukan bug ecryptfs yang Anda sebutkan!
Adam Monsen