Git - comment afficher la liste de TOUS les objets dans la base de données
Est-il un meilleur moyen d'obtenir un raw liste de SHA1s pour TOUS les objets dans un référentiel que de faire ls .git/objects/??/\*
et cat .git/objects/pack/*.idx | git show-index
?
Je sais à propos de git rev-list --all
mais que seuls les listes de commettre des objets référencés par .git/refs, et je suis à la recherche d' tout y compris sans référence les objets qui sont créés par git-hash-object, git-mktree etc.
- Je viens de faire ça hier sur un test de pension sur titres utilisés
ls -alR .git/objects
, mais je suis d'accord c'est pas l'idéal... +1 - D'autre part, si vous êtes à la recherche pour les objets non référencés en particulier, git-fsck [--inaccessible] peut-être d'intérêt...
- ...et ls ne fera que vous donner les objets en vrac, pas le des paniers, ce qui peut également être non référencées, d'où le git show-index dans ma question
- Avec Git 2.19 (T3 2018),
git cat-file --batch-check --batch-all-objects --unordered
est assez rapide. Voir ma réponse ci-dessous.
Vous devez vous connecter pour publier un commentaire.
Edit: Aristote posté une meilleure réponse, qui devrait être marquée comme étant correcte.
Edit: le script contenait une erreur de syntaxe, manquant barre oblique inverse à la fin de la
grep -v
ligneMarc réponse a fonctionné pour moi, après quelques modifications:
--git-dir
au lieu de--show-cdup
à l'appui de nu reposperl
parce que OS X Mountain Lion BSD-stylesed
ne prend pas en charge-r
objects/pack/pack-23fd2d5638f6cd3bf2a433de4ea3cc26ebe7bdfa.idx
grep -v
qui fixe pour moi. Regarde comme le dit Aristote, que je recommande tout de même, n'ont pas cette erreur.Essayer
Modifier Josh a fait un bon point:
liste des objets accessibles à partir du ref-journaux.
Pour voir tous les objets dans l'inaccessible s'engage ainsi:
Mettre tous ensemble, à vraiment obtenir tous les objets dans le format de sortie de
rev-list --objects
, vous besoin de quelque chose commePour trier la sortie en un peu plus utile (par le chemin de l'arbre/blobs, s'engage en premier) d'une
| sort -k2
qui va regrouper tous les différents objets blob (révisions) pour les chemins identiques.refs/
. Le reflogs et l'inaccessible objets ne sont pas inclus.blob
chemin d'accès correspond à chaque SHA, qui est génial. Est-il un bon moyen de les aider à identifier facilement les validations et les arbres? E. g. arbre en chemin, s'engager en première ligne du message de commit.git cat-file --batch-check --batch-all-objects
au lieu de cela plus de script? L'auteur de cette réponse prétend tous les objets sont répertoriés. Pourriez-vous commenter les différences, le cas échéant?Je ne sais pas depuis quand cette option existe, mais vous pouvez
Cela vous donne, selon la page de man,
(l'emphase est mienne).
Par défaut, cela donne le type d'objet et c'est la taille de l'ensemble, avec chaque hachage mais vous pouvez facilement supprimer ces informations, par exemple avec
ou en donnant un format personnalisé à
--batch-check
.C'est plus juste, plus simple et plus rapide interprétation du script à partir des réponses par Marque et par willkill.
Il utilise
rev-parse --git-path
pour trouver leobjects
répertoire, même dans un environnement plus complexe dépôt Git de l'installation (par ex. dans un multi-worktree situation ou que sais-je encore).Il évite tout recours inutile à l'
find
,grep
,perl
,sed
.Si fonctionne normalement même si vous n'avez pas d'objets en vrac ou sans emballage (ou aucun des deux... si vous êtes enclin à exécuter sur une nouvelle référentiel).
Il n'a, cependant, besoin d'un coup à partir de ce millénaire (2.02 ou plus récent, plus précisément, pour la
extglob
bits).De partager et de profiter.
Je ne sais pas à l'évidence de mieux que de simplement regarder tous les morceaux de fichiers objets et les indices de tous les fichiers du pack. Le format du dépôt git est très stable, et avec cette méthode, vous n'avez pas à compter sur ayant exactement les bonnes options à
git fsck
, qui est considéré comme de la porcelaine. Je pense que cette méthode est plus rapide, ainsi. Le script suivant montre tous les objets dans un référentiel:(Ma version d'origine de ce script est basé sur ce script de trouver le plus grand des objets dans vos fichiers de pack, mais je suis passé à l'aide de
git show-index
, comme vous le suggérez dans votre question.)J'ai fait ce script dans un GitHub gist.
La
git cat-file --batch-check --batch-all-objects
commande, suggéré dans Erki Der Loony's réponse, peut être faite plus rapide avec la nouvelle Git 2.19 (T3 2018) option--unordered
.L'API pour itérer sur tous les objets appris à éventuellement les objets de la liste dans l'ordre où ils apparaissent dans packfiles, qui contribue à la localité des accès si l'appelant accède à ces objets, tout comme les objets sont énumérés.
Voir s'engager 0889aae, s'engager 79ed0a5, s'engager 54d2f0d, s'engager ced9fff (14 Août 2018), et s'engager 0750bb5, s'engager b1adb38, s'engager aa2f5ef, s'engager 736eb88, s'engager 8b36155, s'engager a7ff6f5, s'engager 202e7f1 (10 Août 2018) par Jeff King (
peff
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager 0c54cda, 20 Août 2018)Il est encore plus rapide dans Git 2.20 (T4 2018) avec:
Voir s'engager 8c84ae6, s'engager 8b2f8cb, s'engager 9249ca2, s'engager 22a1646, s'engager bf73282 (04 Oct 2018) par René Scharfe (
rscharfe
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager 82d0a8c, 19 Oct 2018)Et avec ce patch:
Git 2.21 (T1 2019) optimise encore la codepath pour écrire commit-graphique, par
suivant le schéma habituel de la visite d'objets dans les en-pack de commande.
Voir s'engager d7574c9 (19 janvier 2019) par Ævar Arnfjörð Bjarmason (
avar
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager 04d67b6, 05 Février 2019)Git 2.23 (T3 2019) améliore "
git rev-liste-des objets
" qui a appris avec "--no-object-names
" option pour piétiner le chemin de l'objet qui est utilisé comme un regroupement astuce pour pack-objets.Voir s'engager 42357b4 (19 Juin 2019) en Emily Shaffer (
nasamuffin
).(Fusionnés par Junio C Hamano --
gitster
-- dans s'engager f4f7e75, 09 Juillet 2019)Donc, c'est la différence entre:
Et, avec
--no-object-name
:Une autre option utile est d'utiliser
git verify-pack -v <packfile>
verify-pack -v
répertorie tous les objets dans la base de données ainsi que leur type d'objet.git verify-pack -v .git/objects/pack/pack-….idx
était la seule commande qui pourrait pourrait confirmer qu'un certain gros fichier a été référencée quelque part, d'autres quegit show Some-SHA1
. S'avère que je n'avais pas passé les bons paramètres àgit reflog expire
... (et encore, le reflog semblait complètement vide!)