Как посмотреть историю размеров одного файла в репозитории git? - PullRequest
27 голосов
/ 30 июня 2010

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

Ответы [ 6 ]

16 голосов
/ 01 июля 2010

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

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

Размер BLOB-объекта в этом примере равен '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
9 голосов
/ 20 августа 2013

Создайте файл с именем .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

9 голосов
/ 30 июня 2010

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

Если у вас установлен ruby ​​и гем 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

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

myproject$ ruby file-size.rb somedir/somefile
2 голосов
/ 19 апреля 2016

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

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
1 голос
/ 09 августа 2017

В 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, пожалуйста ...))

1 голос
/ 30 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...