是否可以获取有关每个提交中更改浪费了多少空间的信息,以便我可以找到添加了大文件或许多文件的提交。这一切都是为了尝试减少git仓库的大小(通过变基和可能的过滤提交)。
是否可以获取有关每个提交中更改浪费了多少空间的信息,以便我可以找到添加了大文件或许多文件的提交。这一切都是为了尝试减少git仓库的大小(通过变基和可能的过滤提交)。
git ls-tree -r -t -l --full-name HEAD | sort -n -k 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
--diff-filter
可以代替不可靠的 grep
,但在我看来,这个答案更好:https://dev59.com/_2gv5IYBdhLWcg3wHNDG#10847242。 - akostadinov#!/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
#!/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 fat find N
其中N表示字节数,将返回历史记录中所有大于N字节的文件。
关于git-fat的更多信息,请访问这里:https://github.com/cyaninc/git-fat
git cat-file -s <object>
其中 <object>
可以是提交、blob、tree 或标签。
git gc
,可能作为git gc --aggressive
运行。 - Hasturkungit gc
(以及git gc --prune
);--aggresive
可能会导致更糟糕的结果(但通常不会),并且通常不值得这样做。 - Jakub Narębski