File danneggiati in Git


8

Di recente ho rimosso alcune cartelle dalla cronologia dei repository git usando il comando seguente:

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

Purtroppo non posso più estrarre da questi repository, questo è il set di errori che sto ottenendo:

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

Su quale sistema Linux hai apportato le modifiche?
— Andres Jaan Tack,

Stavo usando Windows; ora sono su Linux e funziona bene
— mnml

Risposte:


7

Qualche anima gentile ha scritto una sceneggiatura per farlo automaticamente (e più accuratamente), ma il processo di recupero è sostanzialmente questo:

  1. Esaminare il file che segnala immondizia, con hexdump.

    $ hexdump .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    

    Stai cercando una parte del file in cui c'è una grande quantità di zeri. Se ci sono più di tali intervalli, ho avuto buona fortuna (N = 2) quando ho considerato solo il primo gigantesco set di zeri, anche quando includevano piccole serie di dati diversi da zero. Questa è la "spazzatura" di cui Git si lamenta.

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

    È possibile determinare da questo la dimensione reale dell'oggetto. Qui, sarebbe 0x504 o 1.284 byte.

  2. Crea una copia di backup dell'oggetto. Nel caso in cui si scelga un set di zeri errato, è possibile riprovare con un set diverso.

    $ cp .git/objects/4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0 ~/old_4b391c2cc93ccc8d2f7262335629a7f81d6bcbe0
    
  3. Tronca il file alla lunghezza appropriata.

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

L'oggetto corrotto ora dovrebbe essere corretto. Supponendo che fosse l'unico, clonare / spingere / estrarre il repository ora dovrebbe funzionare come previsto.

Citando le mie fonti, credo di aver riscontrato lo stesso problema, ma nel mio caso usando Ubuntu 10.4 (kernel 2.6.32-23-generico). In questo caso, si tratta di un bug del filesystem che non è stato ancora rintracciato. C'è un problema aperto su ecryptfs su questo argomento e anche un thread usenet correlato . Lungo la strada per una soluzione, ho trovato una risposta utile e un riepilogo su StackOverflow. L' articolo collegato è stato molto interessante, anche se alla fine sono andato in un modo diverso.


ENORME grazie per questa risposta. git-remove-trailing-garbage.py (il tuo link con il testo "ha scritto uno script", sopra) ha salvato il mio bacon quando ho incontrato lo stesso bug di ecryptfs che hai menzionato!
— Adam Monsen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.