Подтвердить что ты не робот

Как просмотреть историю файлов одного файла в репозитории git?

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

4b9b3361

Ответ 1

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

Если у вас есть рубин и установлен grit, вот немного script я сбросил вместе:

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

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

myproject$ ruby file-size.rb somedir/somefile

Ответ 2

Вы можете использовать либо 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>, чтобы получить список изменений, затрагивающих данный путь, перевести их в имена блоков, используя синтаксис расширенного SHA-1 <revision>:<path> (см. 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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

В 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, вам будет угодно...))

Ответ 7

Вот функция 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 modules/jaxp-xml-parser/geotk-jaxp-gml/src/main/java/org/geotoolkit/feature/xml/Utils.java