58 votes

Git - comment lister TOUS les objets dans la base de données

Existe-t-il un meilleur moyen d'obtenir une liste brute de SHA1 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 connais git rev-list --all mais cela ne répertorie que les objets commit référencés par .git / refs, et je recherche tout, y compris les objets non référencés créés par git-hash-object, git-mktree etc.

44voto

sehe Points 123151

Essayez

 git rev-list --objects --all

Edit Josh a fait un bon point:

 git rev-list --objects -g --no-walk --all

liste des objets accessibles à partir du ref-journaux.

Pour voir tous les objets dans l'inaccessible s'engage ainsi:

 git rev-list --objects --no-walk \
      $(git fsck --unreachable |
        grep '^unreachable commit' |
        cut -d' ' -f3)

Mettre tous ensemble, pour vraiment obtenir tous les objets dans le format de sortie de l' rev-list --objects, vous besoin de quelque chose comme

{
    git rev-list --objects --all
    git rev-list --objects -g --no-walk --all
    git rev-list --objects --no-walk \
        $(git fsck --unreachable |
          grep '^unreachable commit' |
          cut -d' ' -f3)
} | sort | uniq

Pour trier la sortie en un peu plus utile (par le chemin de l'arbre/blobs, s'engage en premier) utiliser un | sort -k2 qui va regrouper tous les différents objets blob (révisions) pour les chemins identiques.

10voto

willkil Points 445

La réponse de Mark a fonctionné pour moi, après quelques modifications:

  • --git-dir utilisé au lieu de --show-cdup pour prendre en charge les repos nus
  • Erreur évitée lorsqu'il n'y a pas de packs
  • Utilisé perl parce que le style BSD de OS X Mountain Lion sed ne prend pas en charge -r

 #!/bin/sh

set -e

cd "$(git rev-parse --git-dir)"

# Find all the objects that are in packs:

find objects/pack -name 'pack-*.idx' | while read p ; do
    git show-index < $p | cut -f 2 -d ' '
done

# And now find all loose objects:

find objects/ \
    | egrep '[0-9a-f]{38}' \
    | perl -pe 's:^.*([0-9a-f][0-9a-f])/([0-9a-f]{38}):\1\2:' \
;
 

7voto

Mark Longair Points 93104

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 pour git fsck, ce 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:

#!/bin/sh

set -e

cd "$(git rev-parse --show-cdup)"

# Find all the objects that are in packs:

for p in .git/objects/pack/pack-*.idx
do
    git show-index < $p | cut -f 2 -d ' '
done

# And now find all loose objects:

find .git/objects/ | egrep '[0-9a-f]{38}' | \
  sed -r 's,^.*([0-9a-f][0-9a-f])/([0-9a-f]{38}),\1\2,'

(Ma version d'origine de ce script est basé sur ce utile de script pour trouver les plus gros objets dans votre pack de fichiers, mais je suis passé à l'aide d' git show-index, comme vous le suggérez dans votre question.)

J'ai fait ce script dans un GitHub gist.

3voto

nimrodm Points 9191

Une autre option utile consiste à utiliser git verify-pack -v <packfile>

verify-pack -v répertorie tous les objets de la base de données ainsi que leur type d'objet.

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