Git: obtenga todos los commits y blobs que crearon

¿Hay algún command git que pueda mostrarse para cada confirmación?

  1. carné de identidad
  2. tema
  3. blobs que creó con su ruta y tamaño (como git ls-tree -l -r <commit> pero solo para blobs creados)

Para get commits (todos y dar salida a una línea por commit):

 git rev-list --all --pretty=oneline 

A continuación, divida los compromisos por espacio con límite de 2 y obtenga cada identificación y post de confirmación

Para get blobs creados por commit (recurse a subdirectorys, mostrar commits de commit, detectar cambios de nombre y copys, no mostrar ID de commit en la primera línea):

 git diff-tree -r -c -M -C --no-commit-id <commit-sha> 

Un poco de análisis de cada línea y excluyendo algunos de ellos – y obtenemos una list de nuevos blobs y ruta para cometer

El último es get tamaños de blob:

 git cat-file --batch-check < <list-of-blob-shas> 

Y otra vez un poco de análisis

Confiar en git rev-list no siempre es suficiente porque

Lista [s] confirma que se puede acceder siguiendo los enlaces principales de la (s) confirmación (es) determinada (s) [..]

( git help rev-list )

Por lo tanto, no enumera las confirmaciones que están en otra twig y no enumera las confirmaciones que no son alcanzables por ninguna twig (tal vez fueron creadas debido a algunas rebase de rebase y / o de cabeza separada).

Del mismo modo, git log simplemente sigue los enlaces principales de la confirmación actual desprotegida. De nuevo, no ve confirmaciones referencedas por otras twigs o que están en un estado pendiente.

Realmente puedes get todas las confirmaciones con un command como este:

 for i in `(find .git/objects -type f | sed 's@^.*objects/\(..\)/\(.\+\)$@\1\2@' ; git verify-pack -v .git/objects/pack/*.idx | grep commit | cut -f1 -d' '; ) | sort -u` do git log -1 --pretty=format:'%H %P %ai %s%n' $i done 

Para mantenerlo simple, el cuerpo del bucle imprime para cada línea de confirmación una que contiene su hash, el hash padre, date y tema. Tenga en count que para iterar sobre todas las confirmaciones, debe considerar los objects empaquetados y aún no empaquetados.

Puede imprimir los blobs referencedos (y solo los creados) llamando a git diff-tree $i (y greping para capitial A en la quinta columna) desde el cuerpo del bucle.

Puedes get todo less el tamaño de la caja. Este es bastante cercano:

 git log --name-status 

Una solución basada en la respuesta de tig:

 #!/usr/bin/perl foreach my $rev (`git rev-list --all --pretty=oneline`) { my $tot = 0; ($sha = $rev) =~ s/\s.*$//; foreach my $blob (`git diff-tree -r -c -M -C --no-commit-id $sha`) { $blob = (split /\s/, $blob)[3]; next if $blob == "0000000000000000000000000000000000000000"; # Deleted my $size = `echo $blob | git cat-file --batch-check`; $size = (split /\s/, $size)[2]; $tot += int($size); } print "$tot $rev" if $tot > 1000000; # Show only if > 1MiB } 

Tal vez no sea el mejor código, pero debería hacerte la mayor parte del path.

Otro command útil al search

 git fsck --lost-found 

mostrará compromisos vacilantes. Necesitaba usar esto para encontrar un commit ai borrado con un reinicio inoportuno –hard

Pero no crea en mi palabra:

https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html

También puede get una list de todas las confirmaciones (incluidas las colgantes) con:

git log --walk-reflogs | grep -E -o '[0-9a-f]{40}'

Incluya esta línea en la configuration de una nueva vista en gitk (en el último campo de input, el command para generar confirmaciones adicionales) y obtendrá un tree que también muestra el "historial olvidado" del proyecto.