ver tag modificados log crear conflictos cambios archivos archivo git filesize git-diff

tag - Git: muestra la diferencia total de tamaño de archivo entre dos commits?



resolver conflictos git (5)

Ampliando la respuesta de matthiaskrgr , https://github.com/matthiaskrgr/gitdiffbinstat se puede usar como los otros scripts:

gitdiffbinstat.sh HEAD..HEAD~4

Imo realmente funciona bien, mucho más rápido que cualquier otra cosa publicada aquí. Muestra de salida:

$ gitdiffbinstat.sh HEAD~6..HEAD~7 HEAD~6..HEAD~7 704a8b56161d8c69bfaf0c3e6be27a68f27453a6..40a8563d082143d81e622c675de1ea46db706f22 Recursively getting stat for path "./c/data/gitrepo" from repo root...... 105 files changed in total 3 text files changed, 16 insertions(+), 16 deletions(-) => [±0 lines] 102 binary files changed 40374331 b (38 Mb) -> 39000258 b (37 Mb) => [-1374073 b (-1 Mb)] 0 binary files added, 3 binary files removed, 99 binary files modified => [-3 files] 0 b added in new files, 777588 b (759 kb) removed => [-777588 b (-759 kb)] file modifications: 39596743 b (37 Mb) -> 39000258 b (37 Mb) => [-596485 b (-582 kb)] / ==> [-1374073 b (-1 Mb)]

El directorio de salida es funky con ./c/data ... as / c es en realidad la raíz del archivo de los archivos.

¿Es posible mostrar la diferencia total de tamaño de archivo 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 el archivo diff, pero no para los archivos de texto, y no la diferencia total del tamaño del archivo.

¿Algunas ideas?



Puede canalizar la salida de

git show some-ref:some-path-to-file | wc -c git show some-other-ref:some-path-to-file | wc -c

y compara los 2 números.


Un comentario al script: git-file-size-diff, sugerido por patthoyts. La secuencia de comandos es muy útil, sin embargo, he encontrado dos problemas:

  1. Cuando alguien cambia los permisos en el archivo, git devuelve otro tipo en la declaración de caso:

    T) echo >&2 "Skipping change of type" continue ;;

  2. Si ya no existe un valor sha-1 (por alguna razón), el script se bloquea. Necesita validar el sha antes de obtener el tamaño del archivo:

    $(git cat-file -e $D) if [ "$?" = 1 ]; then continue; fi

El enunciado completo del caso se verá así:

case $M in M) $(git cat-file -e $D) if [ "$?" = 1 ]; then continue; fi $(git cat-file -e $C) if [ "$?" = 1 ]; then continue; fi bytes=$(( $(git cat-file -s $D) - $(git cat-file -s $C) )) ;; A) $(git cat-file -e $D) if [ "$?" = 1 ]; then continue; fi bytes=$(git cat-file -s $D) ;; D) $(git cat-file -e $C) if [ "$?" = 1 ]; then continue; fi bytes=-$(git cat-file -s $C) ;; T) echo >&2 "Skipping change of type" continue ;; *) echo >&2 warning: unhandled mode $M in /"$A $B $C $D $M $P/" continue ;; esac


git cat-file -s generará el tamaño en bytes de un objeto en git. git diff-tree puede decirle las diferencias entre un árbol y otro.

Si combina esto en un script llamado git-file-size-diff ubicado en alguna parte de su PATH, podrá llamar a git file-size-diff <tree-ish> <tree-ish> . Podemos intentar 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 ve así:

$ git file-size-diff HEAD~850..HEAD~845 -234 Documentation/RelNotes/1.7.7.txt 112 Documentation/git.txt -4 GIT-VERSION-GEN 43 builtin/grep.c 42 diff-lib.c 594 git-rebase--interactive.sh 381 t/t3404-rebase-interactive.sh 114 t/test-lib.sh 743 tree-walk.c 28 tree-walk.h 67 unpack-trees.c 28 unpack-trees.h total 1914

Al usar git-rev-parse , debe aceptar todas las formas habituales de especificar intervalos de compromiso.

EDITAR: actualizado para registrar el total acumulado. Tenga en cuenta que bash ejecuta la lectura while en una subcamada, de ahí las llaves adicionales para evitar perder el total cuando la subshell se cierra.

EDITAR: se agregó soporte para comparar el índice con otro árbol-ish utilizando un argumento --cached para llamar a git diff-index lugar de a git diff-tree . p.ej:

$ git file-size-diff --cached master -570 Makefile -134 git-gui.sh -1 lib/browser.tcl 931 lib/commit.tcl 18 lib/index.tcl total 244