tener tag repositorios remove qué proyecto podemos para oneline nuestros mayor los log herramienta hacer hace cómo control califican git git-show git-rev-list

tag - ¿qué hace git log-oneline?



Git: cómo enumerar TODOS los objetos en la base de datos (6)

Esta es una interpretación del guión más correcta, simple y rápida de las respuestas de Mark y willkill .

  • Utiliza rev-parse --git-path para encontrar el directorio de objects incluso en una configuración de repositorio de Git más compleja (por ejemplo, en una situación de árbol de múltiples trabajos o lo que sea).

  • Evita todo uso innecesario de find , grep , perl , sed .

  • Si funciona correctamente, incluso si no tiene objetos sueltos o paquetes (o ninguno ... si está dispuesto a ejecutar esto en un repositorio nuevo).

  • Sin embargo, requiere un Bash de este milenio 😊 (2.02 o más reciente, específicamente, para el bit de extglob ).

Comparte y Disfruta.

#!/bin/bash set -e shopt -s nullglob extglob cd "`git rev-parse --git-path objects`" # packed objects for p in pack/pack-*([0-9a-f]).idx ; do git show-index < $p | cut -f 2 -d '' '' done # loose objects for o in [0-9a-f][0-9a-f]/*([0-9a-f]) ; do echo ${o///} done

¿Hay una mejor manera de obtener una lista sin formato de SHA1 para TODOS los objetos en un repositorio que haciendo ls .git/objects/??//* y cat .git/objects/pack/*.idx | git show-index cat .git/objects/pack/*.idx | git show-index ?

Sé sobre git rev-list --all eso, pero solo las listas comprometen objetos a los que se hace referencia por .git / refs, y estoy buscando todo, incluidos objetos sin referencia creados por git-hash-object, git-mktree, etc.


No conozco una manera obviamente mejor que simplemente mirar todos los archivos de objetos sueltos y los índices de todos los archivos del paquete. El formato del repositorio git es muy estable, y con este método no tiene que depender de tener exactamente las opciones correctas para git fsck , que se clasifica como porcelana. Creo que este método es más rápido, también. La siguiente secuencia de comandos muestra todos los objetos en un repositorio:

#!/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,''

(Mi versión original de este script se basó en este útil script para encontrar los objetos más grandes en los archivos del paquete , pero cambié a usar git show-index , como se sugiere en la pregunta).

He convertido esta secuencia de comandos en una esencia de GitHub .


No sé desde cuándo existe esta opción, pero usted puede

git cat-file --batch-check --batch-all-objects

Esto te da, de acuerdo con la página del manual,

todos los objetos en el repositorio y cualquier almacén de objetos alternativo ( no solo objetos alcanzables )

(énfasis mío).

De forma predeterminada, esto proporciona el tipo de objeto y su tamaño junto con cada hash, pero puede eliminar fácilmente esta información, por ejemplo, con

git cat-file --batch-check --batch-all-objects | cut -d'' '' -f1

o dando un formato personalizado para --batch-check .


Otra opción útil es usar git verify-pack -v <packfile>

verify-pack -v enumera todos los objetos en la base de datos junto con su tipo de objeto.


Tratar

git rev-list --objects --all

Editar Josh hizo un buen punto:

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

lista objetos accesibles desde los ref-logs.

Para ver todos los objetos en commit inalcanzables también:

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

Poniendo todo junto, para obtener realmente todos los objetos en el formato de salida de rev-list --objects , necesitas algo como

{ 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

Para ordenar la salida de una manera ligeramente más útil (por ruta para árbol / blobs, commits primero) use un adicional | sort -k2 | sort -k2 que | sort -k2 todos los blobs (revisiones) diferentes para rutas idénticas.


Editar: Aristotle publicó una respuesta aún mejor , que debe marcarse como correcta.

La respuesta de Mark funcionó para mí, después de algunas modificaciones:

  • Se utiliza --git-dir lugar de --show-cdup para admitir repos --show-cdup
  • Error evitado cuando no hay paquetes
  • perl usado porque sed estilo BSD de OS X Mountain Lion no admite -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}'' / | grep -v /pack/ | perl -pe ''s:^.*([0-9a-f][0-9a-f])/([0-9a-f]{38}):/1/2:'' / ;