web-dev-qa-db-fra.com

git: pendants blobs

J'ai récemment couru git fsck --lost-found sur mon référentiel.

Je m'attendais à voir quelques validations pendantes, où j'avais réinitialisé HEAD.

Cependant, j'ai été surpris de voir probablement plus de plusieurs milliers de messages blob pendants.

Je ne crois pas que quelque chose ne tourne pas rond dans mon référentiel, mais je suis curieux de savoir quelles sont les causes de ces taches pendantes? Il n'y a que deux personnes travaillant sur le référentiel, et nous n'avons rien fait d'extraordinaire.

Je ne pense pas qu'ils ont été créés par une ancienne version d'un fichier remplacé par un nouveau, car git devrait conserver les deux blobs pour pouvoir afficher l'historique.

À bien y penser, à un moment donné, nous avons ajouté un très grand répertoire (des milliers de fichiers) au projet par erreur, puis nous l'avons supprimé. Serait-ce la source de tous les blobs pendants?

Je cherche juste un aperçu de ce mystère.

60
wadesworld

La dernière fois que j'ai regardé cela, je suis tombé sur ce fil , en particulier cette partie:

Vous pouvez également vous retrouver avec des objets suspendus dans des packs. Lorsque ce pack est remballé, ces objets seront desserrés, puis expirés finalement selon la règle mentionnée ci-dessus. Cependant, je pense que gc ne remballera pas toujours les anciens packs; il fera de nouveaux packs jusqu'à ce que vous ayez beaucoup de packs, puis les combinera tous (du moins c'est ce que "gc --auto" fera; je ne me souviens pas si "git gc" suit la même règle).

C'est donc un comportement normal, et finalement, je crois.

edit: Par Daniel, vous pouvez le récupérer immédiatement en exécutant

git gc --Prune="0 days"
51
Waynn Lue

J'étais vraiment impatient et habitué:

git gc --Prune="0 days"
24
Daniel

Chaque fois que vous add un fichier dans l'index, le contenu de ce fichier est ajouté à la base de données d'objets de Git en tant qu'objet blob. Lorsque vous reset/rm --cached ce fichier, les blobs existeront toujours (ils seront récupérés la prochaine fois que vous exécuterez gc)

Cependant, lorsque ces fichiers font partie d'un commit et que vous décidez plus tard de reset l'historique, les anciens commits sont toujours accessibles à partir du reflog de Git et ne seront récupérés qu'après un certain temps (généralement un mois, iirc ). Ces objets ne doivent pas apparaître comme pendants, car ils sont toujours référencés par le reflog.

16
knittl