git找到胖子提交

tig*_*tig 52 git statistics commit find

是否有可能获得有关每次提交中的更改浪费了多少空间的信息 - 因此我可以找到添加大文件或大量文件的提交.这都是为了尝试减少git repo大小(重新定位和过滤提交)

Pat*_*otz 24

你可以这样做:

git ls-tree -r -t -l --full-name HEAD | sort -n -k 4
Run Code Online (Sandbox Code Playgroud)

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

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


tig*_*tig 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
Run Code Online (Sandbox Code Playgroud)

  • 断开链接,脚本现在位于[这里](https://github.com/sschuberth/dev-scripts/blob/master/git/git-commit-size.sh) (7认同)

kno*_*cte 5

这里提供的所有解决方案都集中在文件大小上,但是最初提出的问题是关于提交大小,在我看来,就我而言,这更重要(因为我想要的是摆脱许多小二进制文件)在一次提交中引入,总计占很大的空间,但如果按文件单独衡量,则占很小的空间。

这里提供一个专注于提交大小的解决方案,它是以下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`  ;
#  }
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

./git-commit-sizes.pl | sort -n -k 1
Run Code Online (Sandbox Code Playgroud)