如何列出数据库中的所有git对象?
对于存储库中的所有对象,是否有比以下方法更好的获取SHA1原始列表的方法:如何列出数据库中的所有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
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
- 避免了没有包时的错误
- 之所以使用
,是因为OS X Mountain Lion的BSD样式perl
不支持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开始)添加标志--批处理检查
,以加快速度。有关更多详细信息,请参阅。使用新的git 2.19(2018年第3季度)选项--unordered
可以更快地执行s中建议的--unordered
命令 迭代所有对象的API,可以选择按对象在packfiles中的显示顺序列出对象,这有助于调用方在枚举对象时访问这些对象的访问位置 参见,,(2018年8月14日)和,,,(2018年8月10日)。 (于2018年8月20日合并)git cat file--batch check--batch all objects
:支持“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
中的运行时从24秒降低到3.5秒 旁注:实际上还有更多的加速功能可供使用git.git
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)