Résoudre l’erreur "objet file … is empty"
Fichier d’objet vide : kesako ?
Suite à un problème système, votre dépôt Git ne fonctionne plus. L’appel d’une commande telle que git commit vous annonce une erreur du type :
error: object file .git/objects/ee/c6be41e47351f75262a92d3ad9c0be34d2aac8 is empty
fatal: loose object eec6be41e47351f75262a92d3ad9c0be34d2aac8 (stored in .git/objects/ee/c6be41e47351f75262a92d3ad9c0be34d2aac8) is corrupt
Ce que décrit Git ici, c’est qu’un fichier technique lié à notre historique projet s’avère vide, ce qui n’est évidemment pas normal. Il considère donc le dépôt comme « corrompu » car il ne peut reconstruire le chaînage des objets.
L’opération n’a pas fonctionné
Il se peut que cette procédure ne fonctionne pas, par exemple si les objets concernés n’ont pas été partagés avant d’être corrompus. À ce moment là, une solution plus radicale est nécessaire, et les commits en cours locaux non partagés seront perdus. Nuançons toutefois cette perte : vos fichiers projet (hors Git) ne sont pas corrompus, gardez-les dans un coin pour éventuellement faire du copier/coller.
L’idée ici est donc de supprimer le dépôt local et de recloner.
Si vous avez des fichiers à préserver, je vous recommande de garder le répertoire projet, en lui donnant un autre nom par exemple :
cd ..
mv REPERTOIRE_PROJET COPIE_REPERTOIRE_PROJET
Reste alors à récupérer à nouveau le projet depuis le dépôt distant :
git clone URL_DISTANTE REPERTOIRE_PROJET
Cette solution est plus contraignante, mais elle est rapide et efficace. Vous pouvez toutefois tenter une autre approche.
Alternative : suppression du dépôt local
Si vous avez de nombreuses modifications qui risquent d’être pénibles à repliquer, vous pouvez choisir de conserver votre répertoire projet en l’état et de ne remettre d’aplomb que le dépôt local Git, ou dit autrement, le sous-répertoire .git. Notez que si vous avez une configuration locale utile à votre projet, vous devrez la remettre en état à la fin de l’opération.
On commence par la suppression du répertoire :
rm -rf .git
Ensuite, on réinitialise le dépôt local avec Git:
git init
On définit l’URL du dépôt distant et on récupère l’historique projet :
git remote add origin URL-DU-DEPOT
# Vous pouvez choisir de récupérer une autre branche que `main` (`master` par exemple)
git fetch origin main
On se positionne sur la branche dont on a récupéré l’historique pour pouvoir reprendre notre travail :
git switch main
Et voilà, le tour est joué. Évidemment, ce scenario peut produire des situations de conflits/divergences. Dans ce cas, la commande stash peut s’avérer utile.
Vous pouvez aussi regarder le programme de notre formation "Comprendre Git" ou nous poser vos questions sur notre forum discord.
Comment sortir de cette impasse ?
Pas besoin de vous précipiter à supprimer le dossier et recloner complètement ton projet. Les objets corrompus ont probablement été déjà partagés et peuvent être récupérés pour remettre d’aplomb votre projet.
Pour régler le problème, nous devons procéder en trois étapes :
Commençons avec la purge des objets. La commande suivante est valable dans un environnement équivalent Linux (Linux, WSDL, Git bash, MacOS). Pour Windows (Powsershell et consorts), je vous laisse chercher par vous même 😉.
Une fois les objets vides purgés, on peut procéder à la récupération de leur version non corrompue avec la commande
fetch:Enfin, on utilise la commande
fsckqui sert à vérifier la connectivité et l’intégrité des objets dans la base de données Git (ie. le répertoire.git/objects) :Cette dernière commande va produire un rapport, probablement avec des informations de commits ou blob non finalisés (dangling). Si le message d’erreur initial ne réapparait pas, c’est que le dépôt est de nouveau opérationnel. Vous pouvez reprendre le cours normal de votre travail !