すべてのコミットの変更によってどれだけのスペースが浪費されているかについての情報を取得することは可能ですか?それにより、大きなファイルまたは多くのファイルを追加したコミットを見つけることができます。これはすべて、git リポジトリのサイズを縮小しようとするためです (コミットのリベースとフィルタリング)。
7 に答える
あなたはこれを行うことができます:
git ls-tree -r -t -l --full-name HEAD | sort -n -k 4
これにより、一番下に最大のファイルが表示されます(4列目はファイル(blob)サイズです。
別のブランチを調べる必要がある場合は、HEADをそれらのブランチ名に変更する必要があります。または、これを、関心のあるブランチ、タグ、または回転のループに入れます。
返信するのを忘れました、私の答えは次のとおりです。
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
ここで提供されるすべての解決策はファイル サイズに焦点を当てていますが、元の質問はコミット サイズに関するものでした。私の意見では、そして私の場合は、これを見つけることがより重要でした (私が望んでいたのは、多くの小さなバイナリを取り除くことだったからです)。単一のコミットで導入され、合計すると多くのサイズを占めますが、ファイルごとに個別に測定するとサイズは小さくなります)。
コミット サイズに焦点を当てたソリューションは、この 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
git fat find N
ここで、N はバイト単位であり、履歴全体で N バイトより大きいすべてのファイルを返します。
git-fat の詳細については、https ://github.com/cyaninc/git-fat をご覧ください。
個人的には、git リポジトリの履歴で大きなファイルを見つけようとするときに、この回答が最も役立つことがわかりました: Find files in git repo over x megabytes, that don't exist in HEAD
git cat-file -s <object>
どこで<object>
、コミット、ブロブ、ツリー、またはタグを参照できます。