Как посмотреть историю размеров одного файла в репозитории git?
Есть ли способ увидеть, как размер файла менялся со временем в репозитории git? Я хочу увидеть, как мой файл main.js (который состоит из нескольких файлов и минимизирован) со временем вырос и сократился.
9 ответов
Вы можете создать скрипт, который использует вывод из git show --pretty=raw <commit>
чтобы получить дерево, а затем использует git ls-tree -r -l
чтобы получить блоб, который вы ищете, включая размер файла.
Если у вас установлен ruby и grit gem, вот небольшой скрипт, который я написал вместе:
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
Вы можете использовать либо git ls-tree -r -l <revision> <path>
чтобы получить размер капли в данной ревизии, например
$ 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) и отправьте его на git cat-file
, Пример:
$ git rev-list -5 v1.6.0 - gitweb/README | sed -e 's/$/:gitweb\/README/g' | git cat-file - пакетная проверка 825162a0b6dce8c354de67a30abfbad94d29fdde blob 16067 6908036402ffe56c8b0cdcebdfb3dfacf84fb6f1 blob 16011 356ab7b327eb0df99c0773d68375e155dbcea0be blob 14248 8f7ea367bae72ea3ce25b10b968554f9b842fffe blob 13853 8dfe335f73c223fa0da8cd21db6227283adb95ba blob 13801
Создайте файл с именем .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
Вот функция Bash, которая сообщает размер с течением времени в следующем формате.
LoC Date Commit ID Subject
942 2019-08-31 18:09:34 +0200 35fc67c122 Declare some XML namespaces in replacement of OGCPrefixMapper, which has been removed from Apache SIS. https://issues.apache.org/jira/browse/SIS-126
943 2019-08-09 16:52:29 +0200 e8438ab869 fix(GML): fix relative path resolving inside a jar
934 2019-08-05 15:37:46 +0200 1e0c0b03c4 fix(GML): fix all test cases
932 2019-07-30 15:54:53 +0200 fddea5db24 feat(GML): work on fallback for non-xsd Feature store
932 2019-07-23 16:40:23 +0200 8d9a6a7dd0 feat(GML): improve support for custom XML mappings
932 2019-06-26 15:18:43 +0200 43ea6e0bd7 feat(GML): add concurrency support for read/write operations
932 2019-06-21 09:27:41 +0200 07a9993b4b feat(GML): support group reference min/max occurs attributes
932 2019-06-21 09:27:41 +0200 352a9104ae feat(GML): fix resolving local files xsd paths
919 2018-06-08 15:41:26 +0200 01ac7538e7 Merge branch 'master' into sis-migration
919 2018-05-16 16:40:04 +0200 16fe7590c5 fix(JAXP): various fix for WFS 2.0.0
912 2018-04-11 10:09:22 +0200 bf3a38bdc4 chore(*): update JTS version 1.15.0
912 2017-11-09 20:15:23 +0100 bc14dc4be1 fix(Client): fix minor problems on WFS querying
901 2017-10-20 11:41:43 +0200 f686d7ff15 feat(Storage): add support for GML 2.1.2
882 2017-05-16 23:07:31 +0200 f20c34c1e2 refactor(Feature): renamed the Geotk flavor of org.apache.sis.feature package as org.geotoolkit.feature.
Вот функция:
git-log-size() {
git rev-list HEAD -- "$1" | while read cid; do
git cat-file blob "$cid:$1" | wc -l | tr -d '\n'
echo -n $'\t'
git log -1 "--pretty=%ci%x09%h%x09%s" $cid
done | column -t -s$'\t'
}
Это не особенно эффективно, но выполняет свою работу. В нем используются довольно распространенные утилиты (wc, tr, column).
Размер указывается в виде строк кода (LoC), поскольку это общая метрика при разработке программного обеспечения, просто измените параметр "-l" в wc, если вы предпочитаете что-то другое.
Вот как это назвать:
git-log-size <path>
В случае, если это кому-то пригодится, этот скрипт покажет размер данного файла в разных коммитах:
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
В 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, пожалуйста...))
Пока команды вроде git log <filename>
, git whatchanged
и т. д. может показать историю, относящуюся к этому файлу, я нигде не вижу ни во встроенных, ни в пользовательских симпатичных форматах опцию, которая показывает размер (к сожалению, --log-size
опция только для сообщений журнала!).
Однако вы можете получить приблизительное представление о размере, увидев общее количество строк, добавленных и удаленных в каждом коммите. Вы можете визуализировать это с помощью команды git log --stat <filename>
, который использует знаки плюс и минус. Или использовать git log --numstat <filename>
собирать количество строк, добавленных или удаленных в каждом коммите, и использовать числа в некоторой другой визуализации.
Функция Bash, которая отображает размер файла по ревизии:
function git-filehist() {
for rev in $(git rev-list HEAD -- $1); do
git ls-tree -r -l $rev $1
done
}