Показать размер фиксации в журнале git

Как я могу получить размер фиксации, показанный в выводе git log?

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

git log имеет параметр --log-size, но это размер сообщения журнала, а не сама фиксация.


person Cyker    schedule 19.11.2016    source источник
comment
Не могли бы вы привести пример коммита и его размер? Кроме того, зачем вам это нужно?   -  person Schwern    schedule 20.11.2016
comment
@Schwern Я думаю, в своем ответе ниже вы показали, что такое коммит. Мне нужен размер фиксации, чтобы быстро определить, сколько работы выполнено в каждой фиксации из длинного списка коммитов. Это помогает определить основные изменения. Я не налагаю ограничений на его определение, пока это определение разумно.   -  person Cyker    schedule 20.11.2016
comment
Что вы имеете в виду под тем, сколько работы выполняется в каждой фиксации? Для чего вы используете эту информацию? Я чувствую злоупотребление показателями кода.   -  person Schwern    schedule 20.11.2016
comment
Также будьте осторожны, потому что количество строк, измененных в коммите, может быть обманчивым. Например, если я повторно вставлю код, это будет отображаться как изменение большого количества строк, но это очень мало работы. Такие вещи, как -b и -w, могут использоваться для игнорирования изменений пробелов, но некоторые автоматические стилисты кода выходят за рамки простых изменений пробелов.   -  person Schwern    schedule 20.11.2016
comment
@Schwern ОК. Давайте упростим это до предела. Мне нужно число, которое представляет собой сумму добавленных строк и строк, удаленных в каждой фиксации, и добавить это число после заголовка каждой фиксации в сообщении журнала, напечатанном в однострочном формате. Это понятно?   -  person Cyker    schedule 20.11.2016
comment
Почему вы хотите этого? Опять же, я чувствую неправильное использование показателей.   -  person Schwern    schedule 20.11.2016
comment
@Schwern Я понимаю, что строки редактирования могут неточно отражать объем работы, проделанной в каждой фиксации. Но это лучше, чем иметь ничего под рукой. По крайней мере, те крошечные коммиты с очень небольшими изменениями можно легко отфильтровать.   -  person Cyker    schedule 20.11.2016
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Schwern    schedule 20.11.2016
comment
@Schwern (размер коммита) = (байты добавлены) - (байты удалены) вместо добавления / удаления строк кажется достаточно простым ...   -  person Geremia    schedule 21.11.2018


Ответы (1)


«Размер» коммита может означать разные вещи. Если вы имеете в виду, сколько дискового пространства занимает ... это очень сложно сказать в Git и, вероятно, непродуктивно. В то время как что-то вроде хранилищ SVN фиксируется как дельты, когда вы изменяете файл в Git, он сохраняет новую копию файла как объект в базе данных графов. Один объект может использоваться во многих коммитах. Хотя это может показаться неэффективным, в Git есть много умных способов поразительно эффективно использовать дисковое пространство.

Если вы имеете в виду, сколько строк было изменено, это просто. Вы можете использовать различные флаги, чтобы узнать, сколько файлов и строк было изменено, в большинстве из них есть слово "stat". Например, git log --shortstat сообщит вам, сколько файлов было изменено, а также сколько строк было вставлено и удалено. Вот пример.

commit e3d1909c875ea0c1a64246d735affa039ad11aa0 (origin/master, origin/HEAD)
Author: Michael G. Schwern <[email protected]>
Date:   Thu Aug 11 13:04:24 2016 -0700

    Add default Travis and AppVeyor configs.

    The AppVeyor one is set up for Dist::Zilla, the hardest of the bunch.

 2 files changed, 60 insertions(+)

Если вы хотите получить представление о дисковом хранилище, которое представляет коммит, вам нужно получить идентификаторы новых файлов (объектов blob), созданных коммитом, а затем проверить их размер. Вы можете увидеть их в git log -p.

commit 0f28d9a96bc92d802b57900ce4a06db71cbaef6d
Author: Michael G. Schwern <[email protected]>
Date:   Wed Aug 10 09:13:40 2016 -0700

    Remove my name from the gitconfig.

    Now it can be used by anyone. Git will prompt for the user info.

diff --git a/.gitconfig b/.gitconfig
index 1d539bd..538440f 100644
--- a/.gitconfig
+++ b/.gitconfig
@@ -1,18 +1,10 @@
-# If you use this file, remember to change the [user] and [sendemail] sections.
-
...and so on...

index 1d539bd..538440f 100644 указывает, что этот замененный объект большого двоичного объекта (файл) 1d539bd на 538440f и использует разрешения 0644. Если вы запустите git cat-file -s 538440f, он сообщает мне, что размер объекта составляет 4356 байт. Это несжатый размер. На диске всего 1849 байт.

$ ls -l .git/objects/53/8440f84014584432fa5bf09d761926b3d70dbe 
-r--r--r-- 1 schwern staff 1849 Aug 10 09:14 .git/objects/53/8440f84014584432fa5bf09d761926b3d70dbe

После того как я git gc исчез даже объектный файл. Теперь все находится в пакете размером менее 10 КБ.

$ tree -h .git/objects/
.git/objects/
├── [ 102]  info
│   └── [  54]  packs
└── [ 136]  pack
    ├── [1.9K]  pack-d5b7110001ed35cce1aa0a380db762f39505b1c0.idx
    └── [7.8K]  pack-d5b7110001ed35cce1aa0a380db762f39505b1c0.pack

В этом ответе показано, как получить большие двоичные объекты из фиксации более автоматизированным способом.

person Schwern    schedule 19.11.2016
comment
Я думаю, что статистика - хороший способ определить коммиты с серьезными изменениями. Но на выходе они выглядят утомительно. Есть ли шанс, что мы сможем вычислить статистику и распечатать результат в однострочном формате? Например, распечатать каждый коммит с его контрольной суммой, заголовком и числом (#lines_added + #lines_deleted)? Не нашел такого заполнителя в заполнителях формата журнала git. Я что-то упускаю? - person Cyker; 20.11.2016
comment
@Cyker Что-то вроде git log --pretty=format:"%h %s" --shortstat - person Schwern; 14.04.2018