代码之家  ›  专栏  ›  技术社区  ›  tig Charlie Martin

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

  •  16
  • tig Charlie Martin  · 技术社区  · 15 年前

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

    1. 身份证件
    2. 主题
    3. 用路径和大小创建的blob(如 git ls-tree -l -r <commit> 但仅限于已创建的blob)
    6 回复  |  直到 11 年前
        1
  •  26
  •   tig Charlie Martin    15 年前

    要获取提交(所有并每个提交输出一行):

    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>
    

    还有一次有点解析

        2
  •  12
  •   maxschlepzig    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
    

    为了保持简单,循环体为每个提交打印一行,其中包含其哈希、父哈希、日期和主题。注意,重复 全部的 提交您需要考虑打包和尚未打包的对象。

    您可以通过调用 git diff-tree $i (和伟大的投降) A 在第五列)。

        3
  •  5
  •   Dustin    15 年前

    你可以把盒子里除了尺寸以外的任何东西都拿出来。这个非常接近:

    git log --name-status
    
        4
  •  3
  •   Gavin Brock    12 年前

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

    也许不是最好的代码,但应该让你走得更远。

        5
  •  2
  •   starsinmypockets    11 年前

    搜索时的另一个有用命令

    git fsck --lost-found
    

    将显示悬而未决的承诺。我需要用这个来找到一个我用一个不合时宜的重置擦除的提交——很难

    但不要相信我的话:

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

        6
  •  0
  •   Toughy    12 年前

    您还可以获得 全部的 承诺(包括悬而未决的承诺):

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

    在Gitk的新视图设置中包含这一行(在最后一个输入字段中,是生成附加提交的命令),您将得到一个树,它还显示项目的“忘记的历史”。