如何列出git存储库中所有文件的所有版本?
(例如,列出所有包含某个字符串的文件)
此列表可用于捕获文件。
答案 0 :(得分:9)
这是我获取存储库中所有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
的树对象。
答案 1 :(得分:3)
首先,通过列出blob来实现这一目标的可能性很小。 blob只是原始数据;它不知道它是什么文件。真正的答案取决于你究竟想要完成什么。例如,您是否需要搜索属于提交的blob,这些提交甚至无法从提交历史记录中访问?如果你不这样做,这里有几个想法。
也许git-log
的镐搜索会做你想要的:
-S<string>
查找引入或删除<string>
实例的差异。请注意,这与简单地出现在diff输出中的字符串不同;有关更多详细信息,请参阅gitdiffcore(7)中的pickaxe条目。
根据您的最终目标,这可能比您建议的更好 - 您实际上会看到如何添加或删除字符串。如果您愿意,您当然可以使用您获取的信息来捕获整个文件。
或许你想列出git-log
的修订版并在它提供的树(提交)上使用git-grep
?
答案 2 :(得分:0)
据我从手册中了解,以下列出了所有对象及其信息
git cat-file --batch-all-objects --batch-check