【问题标题】:git find fat commitgit 找到胖提交
【发布时间】:2010-11-20 03:32:21
【问题描述】:

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

【问题讨论】:

  • 考虑偶尔运行git gc,可能是git gc --aggressive
  • git gc(和git gc --prune); --aggresive 甚至可以给出更差的结果(但通常不应该),而且通常不值得。
  • 这个答案要好得多:stackoverflow.com/a/10847242/520567

标签: git statistics find commit


【解决方案1】:

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

一个专注于提交大小的解决方案是提供的here,也就是这个 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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 无赖。我在 GitHub Desktop 自带的 Git Shell for Windows 上试了一下,命令没用,报错。
    • @DucRP 我认为你必须在你的电脑上安装 git fat
    【解决方案3】:
    #!/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
    

    【讨论】:

    • 而且我建议使用 git format-patch 来获取提交大小(邮件头会有一些额外的大小,但实际上如果你需要快速提交并不太大 - 这不是那么重要要获得准确的尺寸,+- 1K 将是很好的精度)
    【解决方案4】:

    你可以这样做:

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

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

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

    【讨论】:

      【解决方案5】:

      git cat-file -s <object> 其中<object> 可以指代提交、blob、树或标记。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          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
          

          【讨论】:

          • @sschuberth:如果我正确阅读了您的脚本,它只会考虑在特定提交中添加的文件。它不会检测文件何时在提交中大幅增长。
          • @kynan:你是对的,因为那是 OP 要求的(也是我需要的)。但是更改脚本以检测修改的文件很容易:基本上您只需在 grep 调用中将“A”替换为“M”。这将报告修改后的总文件大小(而不是添加/删除的字节数)。我很乐意接受 GitHub 上的拉取请求,以使脚本更通用。
          • 链接断开,脚本现在位于here
          • --diff-filter 可能被用来代替不可靠的grep 但无论如何,这个答案是更好的IMO:stackoverflow.com/a/10847242/520567
          猜你喜欢
          • 2012-11-03
          • 2011-04-22
          • 2017-05-14
          • 2020-06-07
          • 1970-01-01
          • 2012-03-06
          • 2016-04-26
          • 2014-12-24
          • 1970-01-01
          相关资源
          最近更新 更多