Mon dépôt git s'est en quelque sorte détraqué - j'ai chargé msysgit ce matin et au lieu d'afficher le nom de la branche après le répertoire courant, il indique "((ref : re...))", 'git status' rapporte tout comme un nouveau fichier, 'git log' et 'git reflog' me disent "fatal : bad default revision 'HEAD'", et ainsi de suite.
En faisant 'git reflog --all' ou 'gitk --all', je vois que le reste du dépôt est intact, mais il semble que la branche sur laquelle je travaillais a disparu, ce qui explique pourquoi HEAD ne semble pas exister/pointer vers quoi que ce soit.
Je sais que git conserve toutes sortes d'informations, et je suppose que mes commits ont juste été orphelins d'une manière ou d'une autre, alors y a-t-il une commande qui me montre ces commits pour que je puisse réinitialiser HEAD sur eux ?
EDIT : Oh mon dieu. J'ai découvert 'git fsck', et 'git fsck --full' rapporte "fatal : object 03ca4... is corrupted". Que diable puis-je faire à ce sujet ?
EDIT : Oh dear oh dear. J'ai vérifié une autre branche, puis essayé de recréer la branche originale avec le même nom en utilisant 'git checkout -b lostbranchname', et git dit "error : unable to resolve reference refs/heads/lostbranchname : No error, fatal : Failed to lock ref for update : No error". "No error" doit être une erreur particulièrement désagréable. Il semble donc qu'il traîne toujours, mais qu'il ne peut être ni utilisé ni tué.
EDIT : Super duper oh dear. J'ai fait un tas de déballage et de remballage et de remplacement de choses comme suggéré ici : Comment récupérer les objets Git endommagés par une panne de disque dur ? mais maintenant je reçois un autre hash signalé comme corrompu, pour quelque chose d'aussi inoffensif que "git status". Je pense que tout est fichu. Git est charmant et tout, mais je ne devrais pas avoir à faire face à ce genre de choses.
0 votes
Concernant
git checkout -b lostbranchname
- si vous ne vous souciez que du nom de la branche (et non de son contenu), vous pouvez supprimer manuellement (ou renommer).git/refs/heads/lostbranchname
- qui, espérons-le, fera l'affaire.0 votes
Chkdsk rapporte que tout est ok. J'ai supprimé la branche pendante dans .git/refs/heads/ car elle causait des problèmes, mais maintenant d'autres commandes se plaignent de la corruption d'autres objets, donc je pense que ce n'est pas aussi simple qu'un objet corrompu maintenant.
1 votes
Et vous n'avez pas d'amont où pousser ce dossier git ?
1 votes
Malheureusement non, c'est en fait une sorte de dépôt de substitution pour un système de contrôle de source inférieur, je l'utilise juste localement pour avoir toutes les fonctionnalités de git sans les inconvénients de l'autre système. Mais au moins l'autre système ne se corrompt pas aléatoirement. Cela signifie que tout ce que j'ai perdu, ce sont mes modifications depuis mon dernier enregistrement dans l'autre système, que j'ai déjà récupérées. Il est temps de commencer un nouveau référentiel !
7 votes
J'hésiterais à dire que git vous a fait "faire face à ce genre de choses" ou qu'il s'est corrompu lui-même. Rien, à part une sauvegarde, ne peut être complètement stable contre la perte de données.
1 votes
Je sais vraiment, je suis juste (naturellement) un peu fâché d'avoir perdu mon bel historique. Ce n'est pas la faute de git, n'importe quel autre système se comporterait de la même manière en cas d'erreur du système de fichiers.
0 votes
Je pense que beaucoup d'autres systèmes se comporteraient pire -- en particulier, s'ils ne vous ont pas signalé d'erreur alors qu'il y en avait une, et que vous vous contentez d'une corruption de données dont vous ignorez l'existence. Condoléances pour votre perte :( (Mais j'espère que vous vous en êtes remis et que je ne déterre pas une vieille blessure) ;) (mais je suis tombé sur ce site en cherchant autre chose).
0 votes
@BenHymers il semble que le système de contrôle de source "inférieur" est nettement meilleur à ce qu'il est censé faire - s'occuper de votre code source. Un SCM qui ne fait pas cela est à peu près aussi bon que Visual SourceSafe (qui, d'ailleurs, ne le fait pas).