9
votes

Récupérer le référentiel Git d'objets uniquement

J'ai une boîte à vitres qui l'a prise dans la tête pour supprimer la majeure partie d'un référentiel git (doit avoir déclenché le détecteur de travail important;). Tout ce que j'ai laissé (que je peux trouver) est les objets. Je ne sais pas à quel point la collecte d'objets est complète, non plus. Est-il possible de récupérer des choses de juste les objets? Pour autant que je puisse dire, l'arborescence d'objets est intacte. Tous les paquets et objets en vrac sont en place; Je n'ai tout simplement pas les métadonnées pour convaincre Git.


7 commentaires

Que voulez-vous dire par les objets?


Littéralement, c'est mon repo. ls repo.git donne des "objets" seulement.


Que montre cette commande git show -s


Fatal: Pas un référentiel git .


Eh bien, il semble que Git ne fonctionnera pas pour vous. Je suis malade de voir s'il y a un moyen de décoder les blobs.


Bravo, Jason. Très appréciée.


Affiche l'arborescence d'objets, abondamment jonchée d'objets. C'est tout ce que j'ai. Pas de REF, pas de journaux, de rien que des objets.


3 Réponses :


0
votes

Si vous n'avez pas déjà essayé Git Checkout Master , je commencerais avec ça.


1 commentaires

Il ne peut pas trouver un référentiel git. "Fatal: pas un référentiel git (ou un parent jusqu'à montage parent). Arrêt de la limite de système de fichiers (git_discovery_across_fileSystem pas défini)."



0
votes

Essayez d'utiliser ce message

Comment récupérer des objets Git endommagés par un disque dur échec?

Cette réponse peut avoir des informations connexes * Nix. Laissez-moi savoir si cela aide.

Je vais voir ce que ça fait.


5 commentaires

On dirait que les premières commandes peuvent être utiles. Il vous montre comment déballer le dossier Pack des objets


Oui, je vais prendre ça pour un tour. Ai-je besoin d'introduire un nouveau repo git maintenant?


probablement pas. Je recommanderais de sauvegarder ce que vous avez pour que vous ne perdiez plus. Je dois courir pour le moment. Je vais vérifier quand je reviens.


Je ne pense pas que c'est l'approche optimale. Aucun élément de preuve, les objets ont été endommagés afin de déballer et de récupérer des objets ne devraient pas être nécessaires. Il devrait suffire de récupérer les objets - emballés ou en vrac - dans un référentiel git de travail et en passant de là.


Si vous avez des exemples de comment faire cela, je serai plus disposé à les mettre en place



15
votes

La première chose que j'essaierais, c'est d'initialiser un nouveau référentiel avec git init . Ensuite, je copierais le répertoire des objets du référentiel mort dans le nouveau référentiel. Ensuite, j'exécuterais git fsck dans le nouveau référentiel.

Avec une chance, vous verrez beaucoup d'objets suspendus et avec un peu plus de chance certains des objets dangereux seront des objets qui seront les conseils de branches perdues.

Si vous exécutez git show Git journal sur ces commits, vous pourrez peut-être reconnaître certaines des branches.

pour "récupérer" eux, vous pouvez simplement utiliser branche git pour recréer des branches nommées.


4 commentaires

Impressionnant! J'ai un autre fichier Sha-1 que j'ai besoin de déterminer comment renommer (witless renommé-le à E qui n'est pas utile), et j'ai besoin de me racher la tête, mais cela a bien fonctionné. Cheers, Charles!


Je ne sais pas comment trouver le nom original d'un commit, mais réaménager la tête était aussi simple que git checkout puis crée un maître branche. Maintenant, j'ai besoin de trouver ce que 00 / e devrait être.


@JASKEK: Si l'objet LOCT est valide, vous pouvez également "tromper" git dans la lecture de la lecture d'un objet d'objet lâche non liée (probablement) ("corruption" démontré dans SO5585388 ), puis écrivez-le sur le bon chemin. bash -c 'i = 1; tandis que n = $ (printf% 040x $ i) && git cat-file -s -s "$ n"> / dev / null 2> & 1; Est-ce que je lais i ++; terminé; p = $ (printf .git / objets /%. 2S /% s "$ n" "$ {n # ??}"); écho "Utilisation du nom d'objet Temp $ n à $ p"; SET -X; cp -p "$ 1" "$ p" && t = $ (git cat-fichier -t "$ n") && git cat-fichier "$ t" "$ n" | git hash-objet --stdin -t "$ t" -w && rm -f "$ p" '- .git / objets / 00 / e


@Chris - c'est juste ... Woah. Cela prend le gâteau pour la meilleure bash tordue que j'ai jamais vue. Je a fait rétablir pour récupérer le fichier: GIT a signalé un fichier supprimé de la caisse, alors je suis allé à la chasse, j'ai trouvé le fichier et déplacé.