在git log中显示提交大小

Cyk*_*ker 17 git git-log

如何在输出中显示提交大小git log

你可以理解提交大小为告诉你的父母和自己,或任何合理之间的差异有多大提交的.

git log有一个--log-size选项,但它的日志消息的大小,而不是提交本身.

Edw*_*ach 22

这是一个非常简单/强力的方法来做到这一点:

git format-patch --stdout ref1..ref2 | wc -c

  • 给你和format-patch之间的区别ref1ref2
  • 对于ref1/ ref2,您可以使用任何有效的 git 引用名称,例如a0b1c2d3, HEAD,HEAD~1等。
  • 给出wc -c补丁的大小(以字节为单位)

注意:git 提交元数据也将计入字节大小。这可能是此方法的一个功能或一个错误,具体取决于您到底想要什么信息。Moregit format-patch和/或 unix pipeline/grep可能会给你更多的控制权。


Sch*_*ern 18

提交的"大小"可能意味着不同的东西.如果你的意思是它需要多少磁盘存储空间......在Git中告诉它非常棘手并且可能没有效果.而像SVN存储之类的东西提交为增量,当你在Git中更改文件时,它会将文件的新副本存储为图形数据库中的对象.一个对象可以在许多提交中共享.虽然这可能听起来效率低下,但Git有许多聪明的方法可以有效地使用磁盘空间.

如果你的意思是它改变了多少行,那很容易.您可以使用各种标志来获取更改的文件和行数,其中大多数都包含"stat"一词.例如,git log --shortstat将告诉您更改了多少文件,以及插入和删除了多少行.这是一个例子.

commit e3d1909c875ea0c1a64246d735affa039ad11aa0 (origin/master, origin/HEAD)
Author: Michael G. Schwern <schwern@pobox.com>
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(+)
Run Code Online (Sandbox Code Playgroud)

如果您想了解提交所代表的磁盘存储,您需要获取提交创建的新文件(blob对象)的ID,然后检查它们的大小.你可以在一个中看到它们git log -p.

commit 0f28d9a96bc92d802b57900ce4a06db71cbaef6d
Author: Michael G. Schwern <schwern@pobox.com>
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...
Run Code Online (Sandbox Code Playgroud)

index 1d539bd..538440f 100644表示此替换blob对象(文件)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
Run Code Online (Sandbox Code Playgroud)

在我git gc甚至目标文件消失之后.现在一切都在使用不到10K的包文件中.

$ tree -h .git/objects/
.git/objects/
??? [ 102]  info
?   ??? [  54]  packs
??? [ 136]  pack
    ??? [1.9K]  pack-d5b7110001ed35cce1aa0a380db762f39505b1c0.idx
    ??? [7.8K]  pack-d5b7110001ed35cce1aa0a380db762f39505b1c0.pack
Run Code Online (Sandbox Code Playgroud)

这个答案显示了如何以更自动化的方式从提交中获取blob.

  • 我认为统计数据是识别具有重大变化的提交的好方法.但他们在输出中看起来很乏味.我们有可能用统计数据进行一些计算,并以oneline格式打印结果吗?例如,使用校验和,标题和数字打印每个提交(#lines_added + #lines_deleted)?没有在git log格式的占位符中找到这样的占位符.我错过了什么吗? (3认同)
  • @Cyker 类似`git log --pretty=format:"%h %s" --shortstat` (3认同)