如何列出Git仓库中所有文件的所有版本?
(例如,列出曾经包含某个字符串的所有文件)
这个列表可以用来查看文件。
这是我获取存储库中所有blob的SHA和文件名列表的方法:
$ git rev-list --objects --all | git cat-file --batch-check='%(objectname) %(objecttype) %(rest)' | grep '^[^ ]* blob' | cut -d" " -f1,3-
注:
格式化字符串中的 %(rest)
原子会将对象 SHA 后的输入行剩余部分附加到输出结果。在这种情况下,这个剩余部分恰好是路径名(用于树和 blob 对象)。
grep
模式旨在仅匹配实际的 blob 对象,而不是只是在其路径名中包含字符串 blob
的树对象。
git cat-file --batch-all-objects --batch-check
,如J. Doe的答案所建议并在此展示,请确保使用Git 2.34(2021年第四季度)。git cat-file --batch
" (man) 带有--batch-all-objects
选项将遍历存储库中找到的所有对象,但它曾经使用替换机制翻译这些对象名称,这违背了枚举存储库中所有对象的目的。
请参见提交bf97289,提交818e393,提交5c5b29b,提交c3660cf,提交e879295(由Jeff King (这已在Git 2.34(2021年第四季度)中得到纠正。
peff
)于2021年10月5日进行)。
(由Junio C Hamano -- gitster
--在提交092228e中合并,于2021年10月18日)
cat-file
:使用--batch-all-objects
禁用refs/replace
签名作者: Jeff King
在枚举对象数据库中的所有对象时,不考虑refs/replace
是没有意义的。
此选项的目的是以低级别枚举数据库中的所有对象。
根据定义,我们已经显示替换对象的内容(在其真实oid下),在另一个oid下显示这些内容几乎肯定会违反用户尝试的操作。
和:
cat-file
:对--batch-all-objects
使用packed_object_info()
签名作者: Jeff King
当 "cat-file --batch-all-objects" 遍历每个对象时,它知道在哪里找到每个对象。
但当我们查找对象的详细信息时,我们根本不使用该信息。
此补丁教导它在遍历包中的对象时使用包/偏移对。
这会产生可衡量的速度改进(在完全打包的 linux.git 克隆上进行计时)
根据手册,我理解以下内容列出了所有对象及其信息
git cat-file --batch-all-objects --batch-check
git-show
查看一个 blob 时,就能将其与名称匹配起来。而且你已经丢失了一些关键信息:blob 所属的提交。 - Cascabel