¿Cómo ver el historial de tamaño de file de un solo file en un repository de git?

¿Hay alguna forma de ver cómo el tamaño de un file ha cambiado a través del time en un repository de git? Quiero ver cómo mi file main.js (que es la combinación de varios files y minificado) ha crecido y se ha networkingucido con el time.

Puede crear un script que use la salida de git show --pretty=raw <commit> para get el tree, luego usa git ls-tree -r -l para get el blob que está buscando, incluido el tamaño del file.

En caso de que tenga ruby ​​y la gem de arena instalada, aquí hay un pequeño guión que armé:

 require 'grit' if ARGV.size < 1 puts 'usage: file-size FILE' puts 'run from within the git repo root' exit end filename = ARGV[0].to_s repo = Grit::Repo.new('.') commits = repo.log('master', filename) commits.each do |commit| blob = commit.tree/filename puts "#{commit} #{blob.size} bytes" end 

El uso de ejemplo (filename of script es file-size.rb), le mostrará el historial de somedir / somefile:

 myproject$ ruby file-size.rb somedir/somefile 

Puede usar git ls-tree -r -l <revision> <path> para get el tamaño de blob en la revisión dada, por ej.

 $ git ls-tree -r -l v1.6.0 gitweb / README
 100644 blob 825162a0b6dce8c354de67a30abfbad94d29fdde 16067 gitweb / README

El tamaño de blob en este ejemplo es '16067'. La desventaja de esta solución es que git ls-tree puede procesar solo una revisión a la vez.

En su lugar, puede usar git cat-file --batch-check < <list-of-objects> lugar de alimentar los identificadores blob. Si la location del file no cambió a través del historial (el file no se movió), puede usar git rev-list <starting-point> -- <path> para get una list de revisiones que toquen una ruta dada, tradúzcalas en nombres de blobs usando <revision>:<path> syntax SHA-1 extendida (ver la página de manual de git-rev-parse ), y alimentarlo a git cat-file . Ejemplo:

 $ git rev-list -5 v1.6.0 - gitweb / README | 
   sed-e 's / $ /: gitweb \ / README / g' |
   git cat-file --batch-check
 825162a0b6dce8c354de67a30abfbad94d29fdde blob 16067
 6908036402ffe56c8b0cdcebdfb3dfacf84fb6f1 blob 16011
 356ab7b327eb0df99c0773d68375e155dbcea0be blob 14248
 8f7ea367bae72ea3ce25b10b968554f9b842fffe blob 13853
 8dfe335f73c223fa0da8cd21db6227283adb95ba blob 13801

Cree un file llamado .gitattributes y agregue la siguiente línea:

 main.js -diff 

Esto desactiva los diffs basados ​​en línea para main.js Ahora ejecuta el siguiente command:

 git log --stat main.js 

El logging includeá líneas como

 main.js | Bin 4316 -> 4360 bytes 

Después de que haya terminado, probablemente debería eliminar .gitattributes . No sé qué otros cambios en el comportamiento de git pueden ser causados ​​por el atributo -diff .

Probado con las versiones de Git 1.7.12.4 y 1.7.9.5.

Fuente: respuesta de ewall y https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html#_marking_files_as_binary

En caso de que esto sea útil para alguien, este script mostrará el tamaño de un file determinado en diferentes commits:

 git log <file_name> | grep "^commit" | cut -f2 -d" " | while read hash; do echo -n "$hash -- " git show $hash:<file_path_off_of_git_root_without_leading_slash> | wc -c done 

Mientras que commands como git log <filename> , git whatchanged , etc. pueden mostrar el historial perteneciente a ese file, no veo ningún lugar en los formattings bonitos incorporados o personalizados, una opción que muestra el tamaño (por desgracia, el --log-size opción de --log-size es solo para los posts de logging!).

Sin embargo, puede hacerse una idea aproximada del tamaño al ver el número total de líneas agregadas y eliminadas en cada confirmación. Puede orderarlo de git log --stat <filename> manera con el command git log --stat <filename> , que usa signos más y less. O use git log --numstat <filename> para recostackr la cantidad de líneas agregadas o eliminadas en cada commit y use los numbers en alguna otra visualización.

En Windows estoy usando el siguiente command:

 cmd /c "@echo off & for /l %N in (1 1 30) do git ls-tree -r -l HEAD~%N "C:\path\to\file.txt" 

Mostrará el tamaño de cada una de las últimas 30 versiones.

Si alguien puede convertir eso al command de Linux, eres bienvenido …))