Aujourd’hui, il m’est arrivé un truc auquel je ne m’attendais pas.
Le disque dur sur lequel je bosse a décidé de partir en cacahuète.
Après un fcsk, tout est rentré dans l’ordre et j’ai repris mes sources, fait des modifications, des commit dans mon dépôt git de travail.
Puis j’ai voulu pousser mes modifications vers mon serveur (celui qui fait toutes les sauvegardes entre autres). Et là, ce fut la surprise :
1
2
3
4
5
$ git push
error: inflate: data stream error (incorrect header check)error: corrupt loose object ’d9a64402f258808439c7651ea1993cffad6496a6’
fatal: object d9a64402f258808439c7651ea1993cffad6496a6 is corrupted
fatal: The remote end hung up unexpectedly
Il existe la commande git fsck qui peut, parfois, rétablir les choses. Si c’est le cas, youpi, vous avez gagné, faites des sauvegardes et payez-vous un bon restau.
Si ce n’est pas le cas, vous entrez, comme moi, dans la désespérance la plus totale.
Heureusement, il y a une solution simple (on trouve sur le net plein de solutions compliquées, celle que je vous propose, dont je ne suis que l’interprète est donc facile à mettre en oeuvre).
Un autre clone du dépôt
On commence par faire un autre clone du dépôt de référence, celui vers lequel vous vouliez pousser vos modifications, dans un répertoire provisoire.
1
$ git clone ssh://server/path/to/repo.git
Copie des d’éléments sains.
Nous allons copier la base des objects du dépôt sain vers le dépôt malade.
1
2
$ cd /path/to/old/repo
$ echo /tmp/repo/.git/objects > .git/objects/info/alternates
Utilisation de notre sauvegarde
Et nous allons utiliser la commande git repack qui va utiliser la sauvegarde (car c’est en fait dans un répertoire de sauvegarde que nous avons fait notre copie) pour reconstituer la base.
1
2
3
4
5
6
$ git repack -a -d
Counting objects: 8995, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2630/2630), done.
Writing objects: 100% (8995/8995), done.
Total 8995(delta 6328), reused 8891(delta 6232)