57 votes

Réparer un dépôt Git corrompu

Mon dépôt Git a été corrompu après plusieurs redémarrages difficiles dus à des problèmes d'alimentation électrique et je suis maintenant incapable de le réparer (j'étais au milieu de la mise en place de certains fichiers lors de la dernière coupure de courant) :

$ git status
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument
$ git fsck
fatal: failed to read object 24377c609184c192f3f3c1733bac7115c1080758: Invalid argument
$ git branch -a
(...works, lists branches...)
$ git checkout someotherbranch
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument
$ git log
fatal: failed to read object 3d18855708b0f127d40c13c679559d7679228b69: Invalid argument
$ git log someotherbranch
(...works, shows commits...)

Donc, comme vous pouvez le voir, ma branche actuelle est plutôt mal foutue, et je ne semble pas être en mesure de la réparer. Que puis-je faire pour réparer cela ?

1 votes

S'agit-il d'une version du serveur ? Existe-t-il des clones ou des versions locales que vous pouvez utiliser pour la restauration ?

1 votes

C'est mon répertoire git local... J'ai un clone sur une autre machine que je pourrais utiliser pour tout restaurer (avec quelques commits perdus peut-être), mais je préfère réparer ce repo si possible...

0 votes

Il convient de préciser que le contenu du dossier de travail peut encore être récupéré. Faire git diff > diff.patch Vous pouvez alors l'utiliser comme ceci pour patcher un nouveau clone : git patch -p1 < diff.patch

40voto

Nash Bridges Points 1760

Ma solution pour une situation similaire a été de remplacer un hachage de l'objet endommagé dans le fichier .git/refs/heads/my-working-branch avec un hachage du commit précédent (qui peut être trouvé dans .git/logs/HEAD ).

1 votes

Le référentiel est toujours en panne, mais cela permet de le récupérer.

12 votes

Je ne suis pas sûr de comprendre de quoi il s'agit

3 votes

Wow, ça marche... mon HEAD s'était corrompue en ^@^@^@^@... ou quelque chose comme ça.

24voto

nbushnell Points 534

Cela vient de m'arriver. Je reclone le dépôt dans un nouveau dossier et j'y transfère manuellement mes derniers changements. Ce n'est pas très technique, mais ça marche à chaque fois. J'espère que vous vous souvenez de vos dernières modifications.

12 votes

Vous pouvez simplement remplacer le .git dans le repo cassé avec celui que vous avez reclassé. De cette façon, vous n'avez pas besoin de déplacer vos modifications manuellement. Soyez juste conscient de l'existence des branches. Il se peut que vous deviez cacher et vérifier la bonne branche.

0 votes

Des années plus tard, c'est toujours aussi propre. Mon repo était complètement bourré, donc j'ai gzippé mes fichiers modifiés, remplacé le dossier .git et les ai recollés. C'est fait.

16voto

sanji_minou Points 421

La solution la plus simple pour moi : Vous devez git clone dans un nouveau dossier, puis remplacez le fichier nouveau_dossier/.git vers l'ancien dossier (le dossier cassé). Cela a bien fonctionné pour moi !

git clone ...(remote) new_folder
mv old_folder/.git  old_folder/.git_old
cp -R new_folder/.git  old_folder/

0 votes

J'aime cette méthode parce qu'elle évite de s'embarrasser de commandes et d'options git supplémentaires. Cependant, j'ai dû changer la dernière ligne en ceci : cp -R new_folder/* old_folder/

13voto

Michael Mior Points 13475

Essayez de faire une sauvegarde du référentiel, puis exécutez git reset --hard HEAD@{1} pour revenir à l'étape précédente HEAD et voir si cela fonctionne. Il se peut que ce ne soit que l'actuel HEAD qui est corrompu.

(Vous devez également exécuter fsck sur votre disque si ce n'est déjà fait).

1 votes

$ git reset --hard HEAD@{1} Vérification des fichiers : 100% (5724/5724), terminé. fatal : failed to read object 3d18855708b0f127d40c13c679559d7679228b69 : Invalid argument

1 votes

Non, même chose :( $ git reflog fatal : failed to read object 3d18855708b0f127d40c13c679559d7679228b69 : Invalid argument

0 votes

Peut-être que le fsck du système de fichiers a foiré quelque chose au démarrage, je vois des messages sur le nettoyage des inodes orphelins

10voto

steve Points 1140

Dans mon cas, j'avais activé le TRIM dans OS X avec un disque SSD non Apple (ce qui n'est pas recommandé) et cela a apparemment causé diverses corruptions sur mon disque de démarrage. La livraison corrompue se trouvait donc au fin fond de l'historique.

Je ne me soucie pas trop de réparer mon dépôt, sauf que j'ai quelques branches locales qui étaient trop expérimentales pour prendre la peine de les pousser vers le dépôt distant, et j'aimerais sauver le travail dans ces branches.

Théoriquement, puisqu'il s'agit d'un dépôt local, je pense que Git devrait être capable de se rétablir/réparer en utilisant origin. Pourquoi n'est-ce pas possible ?

Quoi qu'il en soit, je suis tombé sur cette stratégie sympa pour pousser une branche vers un autre dépôt Git local . Malheureusement, le clonage du référentiel dans ../repo_copy puis en l'utilisant comme télécommande locale, l'erreur suivante s'est produite :

! git push --force local_remote HEAD
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument
error: failed to push some refs to '/Users/steve/Dev/repo_copy'

J'ai donc commencé par un dépôt vide, et le fait de pousser des branches vers ce dépôt a fonctionné correctement. Ainsi, pour toute branche locale que j'avais dont git log n'a pas abouti :

....
    Fixing cukes
fatal: failed to read object e0a9dffddeeca96dbaa275636f8e8f5d4866e0ed: Invalid argument

Je me contenterais de vérifier et de faire git push --force local_remote HEAD . La dernière chose que j'ai faite, c'est.. :

! cd ~/Dev/repo_copy
! git remote add origin git@github.com:sdhull/my_repo.git  # real remote

Ensuite, je suis entré dans git config -e et j'ai mis en place ma branche master et j'étais de nouveau opérationnel sans rien perdre !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X