Réparation d'un Dépôt Git Corrompu : Guide Complet de Dépannage

Diagnostiquez et réparez la corruption d'un dépôt Git avec des sauvegardes, git fsck, la réparation de l'index, la récupération via reflog et le re-clonage sécurisé.

Réparation d'un Dépôt Git Corrompu : Guide Complet de Dépannage

Les dépôts Git sont généralement robustes, mais des facteurs externes comme une panne matérielle, des crashs soudains du système, des erreurs de disque, ou même une perte de courant lors d'une opération Git critique (comme l'empaquetage d'objets ou la réécriture de l'historique) peuvent entraîner une corruption des données. Un dépôt corrompu peut se manifester par des erreurs confuses, une incapacité à effectuer des commits, ou des rapports d'objets manquants.

Ce guide propose une approche systématique, étape par étape, pour diagnostiquer le type de corruption, appliquer les techniques de réparation appropriées et récupérer en toute sécurité les données perdues. Étant donné que la corruption d'un dépôt peut entraîner une perte permanente de données, suivez toujours la bonne pratique de créer une sauvegarde de sécurité avant de tenter des réparations invasives.


1. La Sécurité Avant Tout : Sauvegarder le Dépôt Corrompu

Avant d'initier toute commande de réparation, en particulier celles impliquant la manipulation du système de fichiers dans le répertoire .git, vous devez créer une sauvegarde complète. Cela garantit que si le processus de réparation cause d'autres problèmes, vous pouvez revenir à l'état corrompu actuel.

# Naviguez en dehors du répertoire du dépôt
cd ..

# Créez une sauvegarde compressée de tout le répertoire
tar -czvf monrepo_sauvegarde_corrompue.tar.gz monrepo

# Alternativement, copiez le répertoire complet du dépôt
cp -R monrepo monrepo_sauvegarde_$(date +%Y%m%d)

2. Diagnostiquer la Corruption avec git fsck

L'outil principal pour vérifier l'intégrité d'un dépôt Git est git fsck (File System Check). Cette commande scanne la base de données d'objets et les références, à la recherche d'incohérences, d'objets manquants ou de liens brisés.

Exécutez la commande suivante pour une vérification complète :

# Exécutez la vérification d'intégrité avec une sortie détaillée
git fsck --full --unreachable --strict

Interpréter la Sortie de git fsck

Message d'Erreur Signification Sévérité Correction Principale
error: object XXXXX is missing Un objet blob, tree ou commit requis est complètement manquant. Élevée Récupération depuis le dépôt distant/la sauvegarde.
dangling commit XXXXX Un commit existe mais n'est référencé par aucune branche, étiquette ou reflog. Faible/Moyenne Récupération via git reflog.
dangling blob XXXXX Des données existent mais ne sont liées à aucun commit ou tree. Faible Peut généralement être ignoré ou nettoyé.
error: HEAD points to an unborn branch Le fichier .git/HEAD est corrompu ou pointe vers une branche qui n'existe pas. Moyenne Correction manuelle de .git/HEAD ou git reset.

3. Réparer l'Index Git (.git/index)

Le fichier d'index est le cache de la zone de staging que Git utilise pour suivre les modifications entre votre répertoire de travail et le dernier commit. La corruption de l'index est l'un des problèmes les plus courants après un crash système ou un merge échoué.

Si les opérations Git échouent avec des erreurs liées à un index invalide, incohérent ou illisible, l'index doit être reconstruit.

Méthode 1 : Forcer Git à Relire l'Index

La façon la plus sûre de tenter une réparation de l'index est d'effectuer une réinitialisation dure (hard reset), ce qui force Git à réconcilier l'index et le répertoire de travail en fonction du dernier commit.

git reset --hard HEAD

Méthode 2 : Supprimer et Recréer Manuellement l'Index

Si git reset échoue, vous pouvez supprimer le fichier d'index corrompu. Git le recréera automatiquement la prochaine fois qu'une commande (comme git status ou git add) en aura besoin.

Attention : La suppression de l'index effacera votre zone de staging. Toutes les modifications que vous aviez mises en staging (en utilisant git add) seront perdues.

# Supprimez le fichier d'index corrompu
rm .git/index

# Forcez Git à reconstruire l'index à partir de HEAD
git reset

# Vérifiez l'état pour confirmer le fonctionnement
git status

4. Traiter les Objets Brisés et Manquants

Les corruptions impliquant des objets Git brisés (blobs, trees ou commits) sont souvent les plus difficiles à corriger, surtout si l'objet est vraiment manquant. Cependant, parfois la corruption est due à des objets mal empaquetés ou à des objets pendants récupérables.

4.1. Ré-empaquetage du Dépôt

Git stocke les objets soit sous forme de fichiers individuels (loose), soit consolidés dans des fichiers pack. Parfois, l'exécution d'une opération de ré-empaquetage peut résoudre des problèmes d'intégrité mineurs et améliorer les performances.

# Ré-empaquetez tous les objets individuels, vérifiez l'intégrité et nettoyez les anciens fichiers pack
git repack -a -d

# Relancez fsck pour confirmer l'amélioration
git fsck --full

4.2. Récupérer les Commits Pendants via le Reflog

Un dangling commit est un objet commit valide mais inaccessible par toute référence connue (branche, étiquette). Cela se produit souvent après des réinitialisations forcées ou des réécritures d'historique. Le reflog suit l'historique de votre HEAD locale et des références, contenant souvent la clé de la récupération.

  1. Affichez le Reflog :

    git reflog
    

    Recherchez le hash SHA-1 précédant l'action qui a causé la perte (par exemple, HEAD@{5}: reset: moving to origin/main).

  2. Re-référencez le Commit :

    Une fois que vous avez identifié le bon SHA-1 (par exemple, a1b2c3d4), vous pouvez créer une nouvelle branche pointant vers lui, ou réinitialiser votre branche actuelle.

    # Exemple : Créer une nouvelle branche de récupération
    git branch travail_recupere a1b2c3d4
    
    # Alternativement, réinitialisez votre branche actuelle sur le commit pendant
    # (À utiliser avec précaution)
    git reset --hard a1b2c3d4
    

4.3. Gérer les Objets Vraiment Manquants

Si git fsck signale une error: object XXXXX is missing, cela signifie que les données nécessaires à un historique de commit spécifique ne sont plus dans votre base de données d'objets locale (.git/objects).

  • Si un dépôt distant existe : La seule solution fiable est de récupérer l'objet manquant depuis le dépôt distant.

    git fetch origin
    
    # Ensuite, essayez de réparer le lien ou de réinitialiser la branche affectée
    
  • Si aucun dépôt distant n'existe (Corruption Locale) : Si le dépôt est uniquement local et que l'objet est manquant, les données référencées par cet objet sont définitivement perdues, sauf si vous disposez d'une sauvegarde externe.

5. Corriger les Références Corrompues (Refs)

Les références (refs) sont les fichiers dans le répertoire .git/refs/ (par exemple, branches, étiquettes, branches de suivi distant) qui contiennent le hash SHA-1 du commit vers lequel elles pointent. Si ces fichiers sont corrompus (par exemple, ils contiennent des zéros ou des hashs invalides), Git ne peut pas déterminer l'état de vos branches.

5.1. Localisation et Réparation Manuelle

  1. Identifiez la référence corrompue : Le message d'erreur spécifie généralement quelle référence est cassée (par exemple, error: bad ref for branch 'feature/X').

  2. Naviguez vers le répertoire des refs :

    cd .git/refs/heads/
    # ou .git/refs/remotes/origin/
    
  3. Inspectez le fichier : Utilisez un éditeur de texte ou cat pour visualiser le fichier. Il doit contenir exactement 40 caractères hexadécimaux (le hash SHA-1).

  4. Réparation :

    • Si le hash est connu (par exemple, depuis git reflog), collez manuellement le SHA-1 correct de 40 caractères dans le fichier.
    • Si la référence est clairement cassée (par exemple, zéros, données inutiles), supprimez le fichier. Vous devrez ensuite recréer la branche/référence si nécessaire (par exemple, git checkout -b <nom-de-branche> <bon-commit-connu>).

Dernier Recours : Supprimer les Fichiers Reflog Corrompus

Si un fichier reflog spécifique est corrompu et bloque les commandes Git normales, déplacez-le de côté après avoir fait une sauvegarde. La suppression des reflogs efface l'historique de récupération local, donc ne faites cela qu'après l'échec de git fsck, de l'inspection des refs et de la récupération distante.

mv .git/logs .git/logs.corrompu.sauvegarde

6. L'Option de Récupération Finale : Cloner depuis une Source Fiable Connue

Si la corruption du dépôt est étendue ou si les objets nécessaires sont manquants, la méthode de récupération la plus sûre et la plus fiable est d'abandonner le dépôt local actuel et de recloner depuis une source de confiance (généralement un serveur distant comme GitHub, GitLab ou Bitbucket).

# 1. Sauvegardez les modifications de travail du dépôt corrompu
# (par exemple, copiez les fichiers non commités vers un emplacement temporaire)

# 2. Renommez ou supprimez le répertoire du dépôt corrompu
mv monrepo monrepo_mauvais

# 3. Clonez une copie fraîche
git clone <url_distant> monrepo

# 4. Appliquez les modifications de travail sauvegardées au nouveau dépôt

Cette méthode garantit que vous commencez avec une copie garantie propre et validée de l'historique du dépôt, minimisant le risque de corruption persistante.

Point Clé à Retenir

Réparer un dépôt Git corrompu nécessite un diagnostic minutieux à l'aide de git fsck avant d'appliquer des réparations ciblées à l'index, aux objets ou aux références. Donnez toujours la priorité à la sécurité en sauvegardant le répertoire .git avant de commencer. Bien que les méthodes de récupération locales comme git reflog soient puissantes pour récupérer l'historique, le clonage depuis un dépôt distant reste la solution la plus fiable pour les corruptions graves.

Points Clés à Retenir :

  1. Sauvegardez d'abord. (Toujours).
  2. Diagnostiquez avec git fsck --full.
  3. Les problèmes d'index sont généralement résolus avec git reset --hard.
  4. Les objets manquants nécessitent généralement une récupération depuis le dépôt distant.