2010-06-30 22 views

Respuesta

9

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

En caso de que tenga rubí y la gema grit instalado, esto es un pequeño script Tiré juntos:

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 

Ejemplo de uso (nombre de archivo del archivo de secuencia de comandos es-size.rb), le mostrará la historia de somedir/somefile:

myproject$ ruby file-size.rb somedir/somefile 
+0

Me tomó un minuto para encontrar la manera de conseguir que se utilice la gema grano después de instalarlo (caminos cosa), pero que las obras maravillosamente Gracias. – Echo

+0

Agregué un ejemplo de uso, me alegro de que esté funcionando. :) – igorw

+0

Sugerencia menor: cambie 'commits = repo.log ('master', filename)' to commits = repo.log ('HEAD', nombre de archivo) 'para mostrar el sistema de archivos en función de dónde se encuentre actualmente (HEAD) en lugar de asumir el maestro. Por supuesto, permitir una discusión sería genial, pero eso es más trabajo de reflexión que lo que tengo en este momento. ;-) –

1

Mientras comandos como git log <filename>, git whatchanged, etc., pueden mostrar la historia perteneciente a ese archivo, no veo en cualquier lugar, ya sea en el built-in o costumbre bastante formatea una opción que muestra el tamaño (por desgracia, la opción es --log-size solo para los mensajes de registro!).

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 ordenarlo con el comando git log --stat <filename>, que usa signos más y menos. O use git log --numstat <filename> para recopilar la cantidad de líneas agregadas o eliminadas en cada confirmación y use los números en alguna otra visualización.

15

puede utilizar cualquiera git ls-tree -r -l <revision> <path> para obtener el tamaño de burbuja en la revisión dado, por ejemplo,

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

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

En su lugar, puede usar git cat-file --batch-check < <list-of-objects>, al alimentarlo con identificadores de blob. Si la ubicación del archivo no cambió a través del historial (el archivo no se movió), puede usar git rev-list <starting-point> -- <path> para obtener una lista de revisiones que tocan una ruta determinada, traducirlas a nombres de blobs utilizando <revision>:<path> sintaxis SHA-1 extendida (consulte la página de manual git-rev-parse), y alimentarlo al 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 
+0

Transfiera el resultado 'ls-tree' a' awk '{print $ 4 "" $ 5}' 'para obtener solo el tamaño y el nombre del archivo. – l0b0

7

crear un archivo llamado .gitattributes y añadir la siguiente línea:

main.js -diff 

Esto desactiva diferenciaciones basadas en línea para main.js. Ahora ejecute el siguiente comando:

git log --stat main.js 

El registro incluirá como líneas

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: La respuesta de ewall y https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html#_marking_files_as_binary

2

En caso de que esto sea de utilidad para alguien, este guión mostrar el tamaño de un archivo determinado en diferentes compromete:

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 
0

En Windows Estoy utilizando el siguiente comando:

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 que a comandos de Linux que son bienvenidos ...))

Cuestiones relacionadas