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 deobjects
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 porquesed
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:'' /
;