web-dev-qa-db-ja.com

git find fat commit

コミットごとの変更によってどのくらいのスペースが無駄になるかについての情報を取得することは可能ですか?大きなファイルまたは多くのファイルを追加したコミットを見つけることができます。これはすべて、git repoのサイズを小さくしようとするためのものです(コミットのリベースとおそらくフィルタリング)

51
tig

返信を忘れた、私の答えは:

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
16
tig

あなたはこれを行うことができます:

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

これにより、一番下に最大のファイルが表示されます(4番目の列はファイル(ブロブ)のサイズです)。

別のブランチを調べる必要がある場合は、HEADをそれらのブランチ名に変更します。または、これを、関心のあるブランチ、タグ、またはリビジョンのループに挿入します。

23
Pat Notz

ここで提供されるすべてのソリューションはファイルサイズに焦点を当てていますが、最初に尋ねられた質問はコミットサイズ、私の意見では、そして私の場合には、見つけることがより重要でした(私が欲しかったのは、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
5
knocte

git fat find N Nがバイト単位の場合、履歴全体でNバイトより大きいすべてのファイルが返されます。

ここでgit-fatの詳細を確認できます: https://github.com/cyaninc/git-fat

2
Caustic
#!/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
2
Stas Dashkovsky

git cat-file -s <object> どこ <object>は、コミット、ブロブ、ツリー、またはタグを参照できます。

1
artagnon

個人的には、git repoの履歴で大きなファイルを見つけようとするときに、この回答が最も役立つことがわかりました: xメガバイトを超えるgit repoでHEADに存在しないファイルを検索します

1
Michael Baltaks