Git - 获取他们创建的所有提交和blob

tig*_*tig 16 git blob commit

是否有可以为每次提交输出的git命令:

  1. ID
  2. 学科
  3. 它用它们的路径和大小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 ).


Dus*_*tin 5

您可以获得除开箱即用的所有尺寸.这个非常接近:

git log --name-status
Run Code Online (Sandbox Code Playgroud)


Gav*_*ock 5

一种基于 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)

也许不是最好的代码,但应该可以帮助您大部分工作。