55

是否可以获得有关每次提交更改浪费了多少空间的信息 - 所以我可以找到添加大文件或大量文件的提交。这一切都是为了减少 git repo 的大小(变基并可能过滤提交)

4

7 回答 7

25

你可以这样做:

git ls-tree -r -t -l --full-name HEAD | sort -n -k 4

这将在底部显示最大的文件(第四列是文件(blob)大小。

如果您需要查看不同的分支,您需要将 HEAD 更改为这些分支名称。或者,将其放在您感兴趣的分支、标签或转速上的循环中。

于 2009-08-17T19:51:28.560 回答
16

忘记回复了,我的答案是:

git rev-list --all --pretty=format:'%H%n%an%n%s'    # get all commits
git diff-tree -r -c -M -C --no-commit-id #{sha}     # get new blobs for each commit
git cat-file --batch-check << blob ids              # get size of each blob
于 2009-10-12T22:59:06.150 回答
7

这里提供的所有解决方案都集中在文件大小上,但最初提出的问题是关于提交大小的,在我看来,在我的例子中,找到它更重要(因为我想要摆脱许多小的二进制文件在单个提交中引入,总结起来占了很大的大小,但如果按文件单独衡量,则大小很小)。

这里提供了一个专注于提交大小的解决方案,即这个 perl 脚本:

#!/usr/bin/perl
foreach my $rev (`git rev-list --all --pretty=oneline`) {
  my $tot = 0;
  ($sha = $rev) =~ s/\s.*$//;
  foreach my $blob (`git diff-tree -r -c -M -C --no-commit-id $sha`) {
    $blob = (split /\s/, $blob)[3];
    next if $blob == "0000000000000000000000000000000000000000"; # Deleted
    my $size = `echo $blob | git cat-file --batch-check`;
    $size = (split /\s/, $size)[2];
    $tot += int($size);
  }
  my $revn = substr($rev, 0, 40);
#  if ($tot > 1000000) {
    print "$tot $revn " . `git show --pretty="format:" --name-only $revn | wc -l`  ;
#  }
}

我这样称呼它:

./git-commit-sizes.pl | sort -n -k 1
于 2017-01-06T07:24:43.613 回答
2

就个人而言,我发现这个答案在尝试查找 git repo 历史中的大文件时最有帮助:Find files in git repo over x MB, that not exist in HEAD

于 2011-11-30T23:59:39.273 回答
2
#!/bin/bash
COMMITSHA=$1

CURRENTSIZE=$(git ls-tree -lrt $COMMITSHA | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc)
PREVSIZE=$(git ls-tree -lrt $COMMITSHA^ | grep blob | sed -E "s/.{53} *([0-9]*).*/\1/g" | paste -sd+ - | bc)
echo "$CURRENTSIZE - $PREVSIZE" | bc
于 2014-06-01T22:55:16.210 回答
2

git fat find N其中 N 以字节为单位将返回整个历史记录中大于 N 字节的所有文件。

你可以在这里找到更多关于 git-fat 的信息:https ://github.com/cyaninc/git-fat

于 2014-09-11T19:54:56.977 回答
1

git cat-file -s <object>where<object>可以引用提交、blob、树或标记。

于 2009-08-17T12:12:10.377 回答