Git найти жир
Можно ли получить информацию о том, сколько пространства потрачено впустую на изменения в каждой фиксации, поэтому я могу найти коммиты, которые добавили большие файлы или много файлов. Это все, чтобы попытаться уменьшить размер репо git (перезагрузка и, возможно, фильтрация)
Ответы
Ответ 1
Забыл ответить, мой ответ:
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
Ответ 2
Вы можете сделать это:
git ls-tree -r -t -l --full-name HEAD | sort -n -k 4
Здесь будут показаны самые большие файлы внизу (четвертый столбец - размер файла (blob).
Если вам нужно посмотреть на разные ветки, вы захотите изменить HEAD на эти имена ветвей. Или, поместите это в петлю над ветвями, тегами или оборотами, которые вас интересуют.
Ответ 3
Все предлагаемые здесь решения сосредоточены на размерах файла, но исходный вопрос был о фиксировать размеры, что, на мой взгляд, и, в моем случае, было более важно найти (потому что я хотел бы избавиться от многих небольших двоичных файлов, введенных в одном коммите, которые суммировались с учетом большого размера, но небольшого размера, если измерять индивидуально по файлу).
Решение, которое фокусируется на размерах фиксации, представляет собой здесь, то есть этот perl script:
#!/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
git fat find N
, где N находится в байтах, вернет все файлы за всю историю, размер которых больше N байтов.
Вы можете узнать больше о git -fat здесь: https://github.com/cyaninc/git-fat
Ответ 5
git cat-file -s <object>
где <object>
может ссылаться на commit, blob, tree или tag.
Ответ 6
Лично я нашел этот ответ наиболее полезным при попытке найти большие файлы в истории git repo: Найти файлы в git репо за x мегабайтами, которые не существуют в HEAD
Ответ 7
#!/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