16

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

  1. ID
  2. 学科
  3. 它使用路径和大小创建的 blob(例如git ls-tree -l -r <commit>但仅适用于创建的 blob)
4

6 回答 6

26

获取提交(每次提交全部并输出一行):

git rev-list --all --pretty=oneline

然后按空间拆分提交,限制为 2 并获取每个提交 ID 和消息

要获取提交创建的 blob(递归到子目录,显示合并提交,检测重命名和副本,不要在第一行显示提交 ID):

git diff-tree -r -c -M -C --no-commit-id <commit-sha>

对每一行进行一些解析并排除其中一些——我们得到新 blob 的列表以及它们的提交路径

最后是获取 blob 大小:

git cat-file --batch-check < <list-of-blob-shas>

还有一次解析

于 2009-08-23T15:50:58.013 回答
12

依靠git rev-list并不总是足够的,因为它

列出可以通过跟随给定提交的父链接访问的提交 [..]

( 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

为简单起见,循环体为每个提交打印一行,其中包含其哈希、父哈希、日期和主题。请注意,要遍历所有提交,您需要考虑打包和尚未打包的对象。

git diff-tree $i您可以通过从循环主体中调用(并A在第五列中查找大写字母)来打印引用的 blob(并且仅创建的blob)。

于 2012-04-21T09:16:12.820 回答
5

除了尺寸之外,您可以开箱即用。这个非常接近:

git log --name-status
于 2009-08-22T04:35:46.587 回答
4

基于 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
}

也许不是最好的代码,但应该让你大部分时间。

于 2012-03-13T02:20:15.187 回答
2

搜索时另一个有用的命令

git fsck --lost-found

将显示悬空提交。我需要用它来找到一个用不合时宜的重置--hard擦除的提交ai

但不要相信我的话:

https://www.kernel.org/pub/software/scm/git/docs/git-fsck.html

于 2013-05-14T14:59:22.993 回答
0

您还可以通过以下方式获取所有提交(包括悬空提交)的列表:

git log --walk-reflogs | grep -E -o '[0-9a-f]{40}'

将此行包含在 gitk 中新视图的设置中(在最后一个输入字段中,生成额外提交的命令),您将获得一棵树,其中还显示了项目的“被遗忘的历史”。

于 2012-11-08T10:39:25.267 回答