¿Es posible mostrar la diferencia de tamaño de archivo total entre dos confirmaciones? Algo como:
$ git file-size-diff 7f3219 bad418 # I wish this worked :)
-1234 bytes
He intentado:
$ git diff --patch-with-stat
Y eso muestra la diferencia de tamaño de archivo para cada archivo binario en la diferencia, pero no para los archivos de texto, y no la diferencia total de tamaño de archivo.
¿Algunas ideas?
Respuestas:
git cat-file -s
generará el tamaño en bytes de un objeto en git.git diff-tree
puede decirte las diferencias entre un árbol y otro.Poner esto junto en un script llamado
git-file-size-diff
ubicado en algún lugar de su PATH le dará la capacidad de llamargit file-size-diff <tree-ish> <tree-ish>
. Podemos probar algo como lo siguiente:#!/bin/bash USAGE='[--cached] [<rev-list-options>...] Show file size changes between two commits or the index and a commit.' . "$(git --exec-path)/git-sh-setup" args=$(git rev-parse --sq "$@") [ -n "$args" ] || usage cmd="diff-tree -r" [[ $args =~ "--cached" ]] && cmd="diff-index" eval "git $cmd $args" | { total=0 while read A B C D M P do case $M in M) bytes=$(( $(git cat-file -s $D) - $(git cat-file -s $C) )) ;; A) bytes=$(git cat-file -s $D) ;; D) bytes=-$(git cat-file -s $C) ;; *) echo >&2 warning: unhandled mode $M in \"$A $B $C $D $M $P\" continue ;; esac total=$(( $total + $bytes )) printf '%d\t%s\n' $bytes "$P" done echo total $total }
En uso, esto se parece a lo siguiente:
Al usarlo
git-rev-parse
, debería aceptar todas las formas habituales de especificar rangos de confirmación.EDITAR: actualizado para registrar el total acumulado. Tenga en cuenta que bash ejecuta la lectura while en una subcapa, de ahí las llaves adicionales para evitar perder el total cuando la subcapa sale.
EDITAR: soporte agregado para comparar el índice con otro árbol usando un
--cached
argumento para llamar engit diff-index
lugar degit diff-tree
. p.ej:fuente
git-sh-setup
aquí? Parece que no estás usando ninguna de las funciones que define . ¡Sólo me preguntaba!curl -s https://gist.githubusercontent.com/cschell/9386715/raw/43996adb0f785a5afc17358be7a43ff7ee973215/git-file-size-diff | bash -s <tree-ish> <tree-ish>
git rev-parse
así que consulte la sección del manual "Especificación de revisiones" en la documentación de git-rev-parse para obtener todos los detalles. ( git-scm.com/docs/git-rev-parse )Puede canalizar la salida de
y compare los 2 números.
fuente
| wc -c
si usa encat-file -s
lugar deshow
gdbytes () { echo "$(git cat-file -s $1:$3) -> $(git cat-file -s $2:$3)" }
lo que facilita ver cómo cambió el tamaño del archivo desde la última confirmación con, por ejemplo,gdbytes @~ @ index.html
some-ref:
se omite la parte, ¿obtiene el tamaño del archivo en el directorio de trabajo?Hice un script bash para comparar ramas / confirmaciones, etc.por tamaño real de archivo / contenido. Se puede encontrar en https://github.com/matthiaskrgr/gitdiffbinstat y también detecta cambios de nombre de archivos.
fuente
Ampliando la respuesta de matthiaskrgr , https://github.com/matthiaskrgr/gitdiffbinstat se puede usar como los otros scripts:
Imo realmente funciona bien, mucho más rápido que cualquier otra cosa publicada aquí. Salida de muestra:
El directorio de salida es funky con ./c/data ... ya que / c es en realidad la raíz del sistema de archivos.
fuente
Un comentario al script: git-file-size-diff, sugerido por patthoyts. El script es muy útil, sin embargo, he encontrado dos problemas:
Cuando alguien cambia los permisos en el archivo, git devuelve otro tipo en la declaración del caso:
Si un valor sha-1 ya no existe (por alguna razón), el script falla. Necesita validar el sha antes de obtener el tamaño del archivo:
$(git cat-file -e $D) if [ "$?" = 1 ]; then continue; fi
La declaración completa del caso se verá así:
fuente