Daniel Szukitsch

things i do

Broken Git Repo

Aufgrund eines I/O Fehlers ging ein Teil eines git repos kaputt (zum glück habe ich keine wichtigen Daten verloren). Ich konnte zwar noch commiten aber nicht mehr pushen. Wenn ich versuchte mein repo zu pushen warf mir git folgenden Fehler aus:

1
2
3
error: inflate: data stream error (incorrect data check)
error: corrupt loose object '6e8b481aab34ab08aba71c4ba8d49d384b0fa61a'
fatal: loose object 6e8b481aab34ab08aba71c4ba8d49d384b0fa61a (stored in .git/objects/6e/8b481aab34ab08aba71c4ba8d49d384b0fa61a) is corrupt

Ich versuchte das git repo mittels

1
$ git fsck --full

und anderen Befehlen zu repareien. Jedoch meldete mir git immer wieder den oben angeführten Fehler. Das Problem lag daran, dass git immer versucht auf das kaputte File zuzugreifen und es nicht lesen konnte weil es kaputt war.

Nach einigem suchen im Internet bin ich auf ein Tutorial von Linus Torvalds gestoßen wo er beschriebt wie man kaputte repos wieder reparieren kann. Nur leider konnte dieses Tutorial nur Teilweise helfen. Aber der entscheidende Punkt war das Linus ganz zu beginn das kaputte Objekt einfach entfernt und nocheinmal fsck ausführt:

1
2
$ mv .git/objects/6e/8b481aab34ab08aba71c4ba8d49d384b0fa61a ../
$ git fsck --full`

ausführt.

Nun wurden auf einmal ein paar dangling blobs (kann man ignorieren) und ein missing blob (der von vorhin angezeigt):

1
2
3
4
5
6
dangling blob 5d3254aa99d8966e87d411ecce138f8779450f17
missing blob 6e8b481aab34ab08aba71c4ba8d49d384b0fa61a
dangling blob 36bbd2476ff28ea7073262e60b4ca9f698ae3019
dangling blob 70c2b38508cbdbdf8e3f49815665331f283ffa83
dangling blob c9d5288cc6b1ce904d4d29d8a2ed0a6b23c9f24a
dangling blob 46e092070415b722d698401be4d94fed63565c90

Viel weiter bin ich mit dem Tutorial von Linus leider nicht gekommen da die weiteren Schritte nicht möglich waren. An dieser Stelle hat mit das proGit Buch mit dem Kapitel ”Maintenance and Data Recovery” weiter geholfen. Hier wird empfolen sich einen branch anzulegen von einem noch funktionierendem Commit. Mit Hilfe von

1
$ git log -g

kann man sich alle commit und deren hash anzeigen lassen. Nun kann man einen branch erstellen der von einem funktionierenem commit ausgeht:

1
2
$ git branch recover-branch b28f248bac04a7e723dc8421372aa3ca2e
$ git checkout recover-branch`

Nun wurde mir beim ausführen von fsck auch ein kaputter Link wie in den Tutorial von Linus angezeigt:

1
2
3
4
5
6
7
8
9
$ git fsck --fullbroken link from
tree 45d57d2edc155c00e8ef8286ba828c75c7d63449
to blob 6e8b481aab34ab08aba71c4ba8d49d384b0fa61a
     dangling blob 5d3254aa99d8966e87d411ecce138f8779450f17
     missing blob 6e8b481aab34ab08aba71c4ba8d49d384b0fa61a
     dangling blob 36bbd2476ff28ea7073262e60b4ca9f698ae3019
     dangling blob 70c2b38508cbdbdf8e3f49815665331f283ffa83
     dangling blob c9d5288cc6b1ce904d4d29d8a2ed0a6b23c9f24a
     dangling blob 46e092070415b722d698401be4d94fed63565c90

und konnte dem Tutorial weiter folgen. Ich schaute also nach auf was der Link zeigt und addete die Files per anhand:

1
2
3
4
5
6
7
8
9
$ git ls- tree 45d57d2edc155c00e8ef8286ba828c75c7d63449
100755 blob e54e910c0252d03b27b78caead2fc014f1794592 file1
100755 blob 55c97f03572902a927c353e4265f0f884d7bc6a4 file2
100755 blob 6e8b481aab34ab08aba71c4ba8d49d384b0fa61a file3
100755 blob cd18fc89c31c165f882aafbe3db179c741c025ed file4
$git hash-object -w path/to/file1
$git hash-object -w path/to/file2
$git hash-object -w path/to/file3
$git hash-object -w path/to/file4

Danach habe ich ein add und ein commit gemacht bin mir aber nicht ganz sicher ob dies notwendig war. Jetzt nachdem ich ein weiteres mal fsck ausführte gab es keinen weiteren missing blob =)

1
2
3
4
5
$ git fsck --fulldangling blob 5d3254aa99d8966e87d411ecce138f8779450f17
dangling blob 36bbd2476ff28ea7073262e60b4ca9f698ae3019
dangling blob 70c2b38508cbdbdf8e3f49815665331f283ffa83
dangling blob c9d5288cc6b1ce904d4d29d8a2ed0a6b23c9f24a
dangling blob 46e092070415b722d698401be4d94fed63565c90

Zum schluss muss noch ein merge vom master branch in den recover-branch durchgeführt werden:

1
2
3
4
5
6
7
8
9
10
11
$ git merge master
Merge made by recursive.
Auto packing the repository for optimum performance.
You may alsorun "git gc" manually.
See "git help gc" for more information.
Counting objects: 17619, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (16973/16973), done.
Writing objects: 100% (17619/17619), done.
Total 17619 (delta 6323), reused 0 (delta 0)
Removing duplicate objects: 100% (256/256), done.

und das pushen funktioniert auch wieder =)

Fedora 16: oracle java & Firefox »