是否有可以为每次提交输出的git命令:
git ls-tree -l -r <commit>
创建的blob (仅限于创建的blob)tig*_*tig 26
获取提交(全部并且每次提交输出一行):
git rev-list --all --pretty=oneline
Run Code Online (Sandbox Code Playgroud)
然后按空格分割提交,限制为2,并获取每个提交ID和消息
要获取通过提交创建的blob(递归到子目录,显示合并提交,检测重命名和副本,请不要在第一行显示提交ID):
git diff-tree -r -c -M -C --no-commit-id <commit-sha>
Run Code Online (Sandbox Code Playgroud)
对每一行进行一些解析并排除其中一些 - 我们得到新blob的列表以及它们提交的路径
最后是获得blob大小:
git cat-file --batch-check < <list-of-blob-shas>
Run Code Online (Sandbox Code Playgroud)
还有一次解析
max*_*zig 12
依靠git rev-list
并不总是因为它
通过遵循给定提交的父链接[...]可以访问的列表[s]提交
(git help rev-list
)
因此,它不会列出另一个分支上的提交,也不会列出任何分支都无法访问的提交(可能是因为某些rebase
和/或分离头操作而创建的).
同样,git log
只需跟随当前签出提交的父链接.您再次看不到其他分支引用的提交或处于悬空状态的提交.
您可以使用如下命令获得所有提交:
for i in `(find .git/objects -type f |
sed 's@^.*objects/\(..\)/\(.\+\)$@\1\2@' ;
git verify-pack -v .git/objects/pack/*.idx |
grep commit |
cut -f1 -d' '; ) | sort -u`
do
git log -1 --pretty=format:'%H %P %ai %s%n' $i
done
Run Code Online (Sandbox Code Playgroud)
为了简单起见,循环体为每个提交打印一行,其中包含其哈希,父哈希,日期和主题.注意,要迭代所有提交,您需要考虑打包和尚未打包的对象.
您可以通过从循环体调用git diff-tree $i
(并A
在第五列中填充大写字母)来打印引用的blob(并且只创建创建的blob ).
一种基于 tig 答案的解决方案:
#!/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);
}
print "$tot $rev" if $tot > 1000000; # Show only if > 1MiB
}
Run Code Online (Sandbox Code Playgroud)
也许不是最好的代码,但应该可以帮助您大部分工作。
归档时间: |
|
查看次数: |
18260 次 |
最近记录: |