如何列出数据库中的所有git对象?

如何列出数据库中的所有git对象?,git,git-show,git-rev-list,Git,Git Show,Git Rev List,对于存储库中的所有对象,是否有比以下方法更好的获取SHA1原始列表的方法: ls.git/objects/??/\* 和 cat.git/objects/pack/*.idx | git显示索引 我知道git rev list--all但它只列出由.git/refs引用的提交对象,我正在查找所有内容,包括由git hash object创建的未引用对象、git mktree等等。试试看 git rev-list --objects --all 编辑Josh说得很好: git rev-li

对于存储库中的所有对象,是否有比以下方法更好的获取SHA1原始列表的方法:
ls.git/objects/??/\*


cat.git/objects/pack/*.idx | git显示索引

我知道
git rev list--all
但它只列出由
.git/refs
引用的提交对象,我正在查找所有内容,包括由
git hash object
创建的未引用对象、
git mktree
等等。

试试看

 git rev-list --objects --all

编辑Josh说得很好:

 git rev-list --objects -g --no-walk --all
列出可从ref日志访问的对象

要查看不可访问提交中的所有对象,请执行以下操作:

 git rev-list --objects --no-walk \
      $(git fsck --unreachable |
        grep '^unreachable commit' |
        cut -d' ' -f3)

总而言之,要真正以
rev list--objects
的输出格式获取所有对象,您需要

{
    git rev-list --objects --all
    git rev-list --objects -g --no-walk --all
    git rev-list --objects --no-walk \
        $(git fsck --unreachable |
          grep '^unreachable commit' |
          cut -d' ' -f3)
} | sort | uniq

要以稍微更有用的方式对输出进行排序(按树/blob的路径,首先提交),请使用一个附加的
| sort-k2
,它将所有不同的blob(修订版)分组以获得相同的路径。

我不知道有什么明显更好的方法比只查看所有松散对象文件和所有包文件的索引更好。git存储库的格式非常稳定,使用这种方法,您不必依赖于有正确的选项来
git fsck
,它被归类为瓷器。我认为这种方法也更快。以下脚本显示存储库中的所有对象:

#!/bin/sh

set -e

cd "$(git rev-parse --show-cdup)"

# Find all the objects that are in packs:

for p in .git/objects/pack/pack-*.idx
do
    git show-index < $p | cut -f 2 -d ' '
done

# And now find all loose objects:

find .git/objects/ | egrep '[0-9a-f]{38}' | \
  sed -r 's,^.*([0-9a-f][0-9a-f])/([0-9a-f]{38}),\1\2,'
#/垃圾箱/垃圾箱
set-e
cd“$(git版本解析--显示cdup)”
#查找包中的所有对象:
对于p in.git/objects/pack/pack-*.idx
做
吉特指数<$p | cut-f2-d“
完成
#现在找到所有松动的物体:
find.git/objects/|egrep'[0-9a-f]{38}'|\
sed-r's,^.*([0-9a-f][0-9a-f])/([0-9a-f]{38}),\1\2,'
(这个脚本的原始版本是基于,但正如您在问题中所建议的,我改用了
git show index

我已将此脚本制作成。

编辑:已发布,应标记为正确

编辑:脚本包含语法错误,
grep-v
行末尾缺少反斜杠

经过几次修改后,马克的回答对我很有用:

  • 使用
    --git dir
    代替
    --show cdup
    支持裸回购
  • 避免了没有包时的错误
  • 之所以使用
    perl
    ,是因为OS X Mountain Lion的BSD样式
    sed
    不支持
    -r

#/垃圾箱/垃圾箱
set-e
cd“$(git rev parse--git dir)”
#查找包中的所有对象:
查找对象/pack-name“pack-*.idx”|同时读取p;做
吉特指数<$p | cut-f2-d“
完成
#现在找到所有松动的物体:
查找对象/\
|白鹭'[0-9a-f]{38}'\
|grep-v/pack/\
|perl-pe的:^.*([0-9a-f][0-9a-f])/([0-9a-f]{38}):\1\2:'\
;

另一个有用的选项是使用
git-verify-pack-v


verify pack-v
列出数据库中的所有对象及其对象类型。

这是一种更正确、更简单、更快速的脚本格式副本,可从答案和答案中获得

  • 它使用
    rev parse--git path
    来查找
    对象
    目录,即使是在更复杂的git存储库设置中(例如,在多工作树或其他情况下)

  • 它避免了所有不必要的使用
    find
    grep
    perl
    sed

  • 即使您没有松散的对象或包(或者两者都没有……如果您倾向于在新的存储库上运行此功能),If也能正常工作


  • 但是,它确实需要从这个千年开始的重击我不知道这个选项何时存在,但是你可以

    git cat-file --batch-check --batch-all-objects
    
    根据手册,这会让你

    存储库中的所有对象和任何备用对象存储(不仅仅是可访问的对象

    (我的重点)

    默认情况下,这将生成对象类型及其大小以及每个哈希值,但您可以轻松删除此信息,例如

    git cat-file --batch-check --batch-all-objects | cut -d' ' -f1
    
    或者通过将自定义格式指定给
    --批处理检查

    编辑:如果你不在乎顺序,你可以(从Git 2.19开始)添加标志
    --unordered
    ,以加快速度。有关更多详细信息,请参阅。

    使用新的git 2.19(2018年第3季度)选项
    --unordered
    可以更快地执行s中建议的
    git cat file--batch check--batch all objects
    命令

    迭代所有对象的API,可以选择按对象在packfiles中的显示顺序列出对象,这有助于调用方在枚举对象时访问这些对象的访问位置

    参见,,(2018年8月14日)和,,,(2018年8月10日)。 (于2018年8月20日合并)

    cat文件
    :支持“
    无序
    ”输出,用于
    ——批处理所有对象
    如果要访问packfile中每个对象的内容,通常按打包顺序访问比按散列顺序访问效率更高。 这增加了packfile中的访问位置,这反过来对delta基缓存更友好,因为packfile将相关的delta彼此相邻。 相比之下,散列顺序实际上是随机的,因为sha1没有可识别的 与内容的关系

    此修补程序为
    cat文件
    引入了一个“
    --unordered
    ”选项,该选项在引擎盖下按包装顺序对包装进行迭代。您可以在转储所有文件内容时看到结果:

    $ time ./git cat-file --batch-all-objects --buffer --batch | wc -c
    6883195596
    
    real 0m44.491s
    user 0m42.902s
    sys  0m5.230s
    
    $ time ./git cat-file --unordered \
                          --batch-all-objects --buffer --batch | wc -c
      6883195596
    
    real 0m6.075s
    user 0m4.774s
    sys  0m3.548s
    
    输出相同,顺序不同,速度更快。 即使您最终访问的对象内容为 不同的过程,如:

    git cat-file --batch-all-objects --buffer --batch-check |
    grep blob |
    git cat-file --batch='%(objectname) %(rest)' |
    wc -c
    
    将“
    --unordered
    ”添加到第一个命令会将
    git.git
    中的运行时从24秒降低到3.5秒

    旁注:实际上还有更多的加速功能可供使用
    git cat-file --batch-all-objects --buffer --batch-check |
    grep blob |
    git cat-file --batch='%(objectname) %(rest)' |
    wc -c
    
    git cat-file --batch-all-objects --buffer --batch-check
    
    $ cmd="./git-cat-file --batch-all-objects --unordered --buffer --batch-check='%(objectname)'"
    
    $ /usr/bin/time $cmd >/dev/null
    0.22user 0.03system 0:00.25elapsed 99%CPU (0avgtext+0avgdata 48484maxresident)k
    0inputs+0outputs (0major+11204minor)pagefaults 0swaps
    
    $ hyperfine "$cmd"
    Benchmark #1: ./git-cat-file --batch-all-objects --unordered --buffer --batch-check='%(objectname)'
    
    Time (mean ± σ):     250.0 ms ±   6.0 ms    [User: 225.9 ms, System: 23.6 ms]
    
    Range (min … max):   242.0 ms … 261.1 ms
    
    $ /usr/bin/time $cmd >/dev/null
    0.14user 0.00system 0:00.15elapsed 100%CPU (0avgtext+0avgdata 41396maxresident)k
    0inputs+0outputs (0major+8318minor)pagefaults 0swaps
    
    $ hyperfine "$cmd"
    Benchmark #1: ./git-cat-file --batch-all-objects --unordered --buffer --batch-check='%(objectname)'
    
    Time (mean ± σ):     151.9 ms ±   4.9 ms    [User: 130.5 ms, System: 21.2 ms]
    
    Range (min … max):   148.2 ms … 170.4 ms
    
    git rev-list --objects HEAD | cut -f 1 -d ' ' |
        git cat-file --batch-check
    
    git rev-list --objects --filter=tree:1 --max-count=1 HEAD |
        xargs -I% echo "AA%AA"
    
    git rev-list --objects --no-object-names HEAD | git cat-file --batch-check
    
    vonc@vonvb:~/gits/src/git$ git rev-list --objects HEAD~1..
    9d418600f4d10dcbbfb0b5fdbc71d509e03ba719
    590f2375e0f944e3b76a055acd2cb036823d4b44 
    55d368920b2bba16689cb6d4aef2a09e8cfac8ef Documentation
    9903384d43ab88f5a124bc667f8d6d3a8bce7dff Documentation/RelNotes
    a63204ffe8a040479654c3e44db6c170feca2a58 Documentation/RelNotes/2.23.0.txt
    
    vonc@vonvb:~/gits/src/git$ git rev-list --objects --no-object-names HEAD~1..
    9d418600f4d10dcbbfb0b5fdbc71d509e03ba719
    590f2375e0f944e3b76a055acd2cb036823d4b44
    55d368920b2bba16689cb6d4aef2a09e8cfac8ef
    9903384d43ab88f5a124bc667f8d6d3a8bce7dff
    a63204ffe8a040479654c3e44db6c170feca2a58
    
    git cat-file --batch-check --batch-all-objects | grep blob | cut -d" " -f1 | xargs -n1 git rev-list --objects -g --no-walk --all > .recovered/allblobobject.txt
    cat .recovered/allblobobject.txt | sort | uniq > .recovered/allblobuniqobject.txt
    
    git fsck --full --no-reflogs --unreachable --lost-found | grep blob | cut -d" " -f3 > .recovered/bloblist.txt
    for /F "tokens=*" %A in (.recovered/bloblist.txt) do (git cat-file -p %A > .recovered/%A)