2010-06-30 4 views
25

Есть ли способ увидеть, как размер файла изменился во времени в репозитории git? Я хочу посмотреть, как мой файл main.js (который представляет собой комбинацию нескольких файлов и уменьшен) со временем вырос и сжался.Как просмотреть историю файлов одного файла в репозитории git?

ответ

9

Вы можете создать скрипт, который использует вывод из git show --pretty=raw <commit>, чтобы получить дерево, а затем использует git ls-tree -r -l для получения желаемого блоба, включая размер файла.

В случае, если у вас есть рубин и grit камень установлен, вот небольшой скрипт, я бросил вместе:

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 

Пример использования (имя файла сценария файла size.rb), покажет вам историю somedir/некий-файл:

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

Принимал мне минуту, чтобы выяснить, как заставить его использовать наждачную камень после его установки (пути вещь), но это работает чудесно. Спасибо. – Echo

+0

Я добавил пример использования, рад, что он работает. :) – igorw

+0

Незначительное предложение: изменить 'commits = repo.log ('master', filename)' to commits = repo.log ('HEAD', filename) ', чтобы показать файловую систему на основе того, где вы сейчас находитесь (HEAD) вместо предположения хозяина. Разумеется, разрешение споров было бы круто, но это больше похоже на мышление, чем у меня сейчас. ;-) –

1

Хотя команды, как git log <filename>, git whatchanged и т.д. могут показать историю, относящиеся к этому файлу, я не видел нигде ни в одном встроенной или пользовательской довольно форматирует вариант, который показывает размер (к сожалению, опция --log-size является только для сообщений журнала!).

Однако вы можете получить приблизительное представление о размере, увидев общее количество строк, добавленных и удаленных в каждой фиксации. Вы можете визуализировать его с помощью команды git log --stat <filename>, которая использует знаки «плюс» и «минус». Или используйте git log --numstat <filename>, чтобы собрать количество строк, добавленных или удаленных в каждой фиксации, и использовать числа в некоторой другой визуализации.

15

Вы можете использовать либо git ls-tree -r -l <revision> <path>, чтобы получить размер блоб при данной ревизии, например,

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

Размер блока в этом примере равен '16067'. Недостатком этого решения является то, что git ls-tree может обрабатывать только одну ревизию сразу.

Вместо этого вы можете использовать git cat-file --batch-check < <list-of-objects>, подавая ему идентификаторы blob. Если местоположение файла не изменилось в истории (файл не был перемещен), вы можете использовать git rev-list <starting-point> -- <path>, чтобы получить список изменений, затрагивающих данный путь, перевести их в имена капель, используя <revision>:<path> расширенный синтаксис SHA-1 (см. git-rev-parse manpage) и подайте его на git cat-file. Пример:

 
$ 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

Вывести вывод 'ls-tree' на' awk '{print $ 4 "" $ 5}' ', чтобы получить только размер и имя файла. – l0b0

7

Создайте файл с именем .gitattributes и добавьте следующую строку:

main.js -diff 

Это выключит построчное сравнение для main.js. Теперь запустите следующую команду:

git log --stat main.js 

Журнал будет включать в себя строки, как

main.js | Bin 4316 -> 4360 bytes 

После того как вы закончите, вы, вероятно, следует удалить .gitattributes. Я не знаю, какие другие изменения в поведении git могут быть вызваны атрибутом -diff.

Протестировано с версиями git 1.7.12.4 и 1.7.9.5.

Источник: ответ ewall и https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html#_marking_files_as_binary

2

В случае, если это использования для кого-то, этот скрипт покажет размер данного файла в различных фиксаций:

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

В Windows я использую следующая команда:

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

Он покажет размер каждой из последних 30 версий.

Если кто-то может конвертировать, что в команде Linux вы радушны ...))

Смежные вопросы