git - 在 git 日志中显示提交大小

标签 git git-log

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

您可能将提交大小理解为其父项与其自身之间的差异,或者任何可以告诉您有多大提交的合理信息。

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

最佳答案

提交的“大小”可能意味着不同的事情。如果您指的是它占用了多少磁盘存储空间……这在 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(+)

如果您想了解提交所代表的磁盘存储,您需要获取提交创建的新文件(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...

index 1d539bd..538440f 100644 表示这个用 538440f 替换的 blob 对象(文件)1d539bd 并使用权限 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 之后,目标文件也不见了。现在一切都在一个不到 10K 的包文件中。

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

This answer展示了如何以更自动化的方式从提交中获取 blob。

关于git - 在 git 日志中显示提交大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40697663/

相关文章:

git - 当一个人添加一个未跟踪的文件时,它不会立即进入暂存状态吗?

git rebase master 特性给出(重命名/删除)冲突,git rebase -i master 特性没有

git - 你如何在 Git 提交中搜索制表符?

git - "branch"到底是什么意思?

git - Oracle SQL Developer 导出源以进行版本控制

Git 日志打印 Ref 元数据到文件

git - 如何获取两个 git 分支之间不同提交的列表?

git - 如何从浅克隆中获取完整的提交日志?

git - 如何找到两个分支之间的待提交提交(排除已经挑选/merge 的更改)?

git - 何时在 Git 中使用 '--no-ff' merge 选项