Git : réparer un dépôt corrompu 'Fichier objet vide'


Capture d’écran de Git

Le problème : “error: le fichier objet est vide”

Il peut arriver, suite à une panne d’électricité ou un défaut de support de données, que votre dépôt Git se retrouve corrompu :

⤷ git status
error: le fichier objet .git/objects/f8/fa13b839f8d33583e552610a1f2760f1e39018 est vide
error: le fichier objet .git/objects/f8/fa13b839f8d33583e552610a1f2760f1e39018 est vide
fatal: l'objet libre fa13b839f8d33583e552610a1f2760f1e39018 (stocké dans .git/objects/f8/fa13b839f8d33583e552610a1f2760f1e39018) est corrompu

Il est possible faire une tentative avec git fsck, mais dans mon cas la réponse fut “fatal: l’objet libre est corrompu”:

⤷ git fsck --full
error: le fichier objet .git/objects/f8/fa13b839f8d33583e552610a1f2760f1e39018 est vide
error: impossible de mmap .git/objects/f8/fa13b839f8d33583e552610a1f2760f1e39018: Aucun fichier ou dossier de ce type
error: fa13b839f8d33583e552610a1f2760f1e39018: object corrupt or missing: .git/objects/f8/fa13b839f8d33583e552610a1f2760f1e39018
Vérification des répertoires d'objet: 100% (256/256), fait.
error: le fichier objet .git/objects/f8/fa13b839f8d33583e552610a1f2760f1e39018 est vide
error: le fichier objet .git/objects/f8/fa13b839f8d33583e552610a1f2760f1e39018 est vide
fatal: l'objet libre fa13b839f8d33583e552610a1f2760f1e39018 (stocké dans .git/objects/f8/fa13b839f8d33583e552610a1f2760f1e39018) est corrompu

La solution

  • Faites une sauvegarde de l’ensemble du dossier, de préférence sur un autre support car ce message d’erreur peut être le signe que votre disque dur est en fin de vie
  • Ouvrez le fichier .git/logs/HEAD
  • Copiez le numéro de l’avant-dernier commit, situé en bas du fichier
  • Collez ce numéro dans .git/refs/heads/master (adaptez selon la branche correspondant à votre situation)
  • Comparez maintenant votre dossier avec sa sauvegarde (pour ça vous pouvez utiliser Meld) et commitez les modifications

Référence

https://stackoverflow.com/a/8616352 (en anglais)

La photo de couverture est de Yancy Min

git