代码之家  ›  专栏  ›  技术社区  ›  tig Charlie Martin

Git找到Fat提交

  •  49
  • tig Charlie Martin  · 技术社区  · 15 年前

    有没有可能获得关于每次提交中的更改浪费了多少空间的信息,这样我就可以找到添加了大文件或大量文件的提交。这一切都是为了减少git repo的大小(重新平衡并可能过滤提交)

    7 回复  |  直到 7 年前
        1
  •  20
  •   om-nom-nom    10 年前

    你可以这样做:

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

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

    如果您需要查看不同的分支,您将希望将head更改为那些分支名称。或者,把它放到你感兴趣的分支、标签或Rev的循环中。

        2
  •  16
  •   tig Charlie Martin    14 年前

    忘记回答,我的回答是:

    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
    
        3
  •  4
  •   raphinesse    7 年前

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

    提供了一个专注于提交大小的解决方案 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
    
        4
  •  2
  •   Gîanfranco P.    7 年前

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

    您可以在这里了解更多关于Git Fat的信息: https://github.com/cyaninc/git-fat

        5
  •  1
  •   Community Justin Hirsch    7 年前

    就我个人而言,当我试图在Git回购历史中查找大型文件时,我发现这个答案非常有用: Find files in git repo over x megabytes, that don't exist in HEAD

        6
  •  1
  •   Dominik Honnef CEN    12 年前

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

        7
  •  1
  •   Stas Dashkovsky    10 年前
    #!/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