我在CLI上运行了以下命令:git rev-list --all | xargs -I '{}' git ls-tree --full-tree -r '{}' | grep '.*Foo.*'
它返回了以下内容:
100644 blob 33265039940178412e18a8654bef5c31fa9694b5 Assets/Editor/Foo.cs.meta
100644 blob e1f400f00b3efa867436d3b7f040917ca9f5d08c Assets/Editor/Foo.cs
我想查看Foo.cs的内容,但是当我键入git checkout e1f400f00b3efa867436d3b7f040917ca9f5d08c
时,它显示为fatal: reference is not a tree: e1f400f00b3efa867436d3b7f040917ca9f5d08c
。
我如何查看该文件的内容?
答案 0 :(得分:1)
通过哈希ID:
git cat-file -p e1f400f00b3efa867436d3b7f040917ca9f5d08c
按名称:
git cat-file -p <rev>:Assets/Editor/Foo.cs
git show <rev>:Assets/Editor/Foo.cs
其中<rev>
是git rev-parse
可接受的指定提交或树的语法。例如,如果标记名v2.1
标识包含这些文件的提交,则可以使用git show v2.1:Assets/Editor/Foo.cs
。
(注意:这里-p
的{{1}}标志并不是真正必需的,但是在检查树对象时非常重要,因为树对象存储为二进制数据。您可以强制指定期望的类型git对象,或者只是让git cat-file
弄清楚如何显示它。)
答案 1 :(得分:1)
以您的示例为例,git cat-file blob 33265039940178412e18a8654bef5c31fa9694b5
将返回Assets/Editor/Foo.cs.meta
的内容,而无需执行任何git checkout
。
更好的是,git cat-file --batch
可以在stdin上获得ID流,并从每个ID中发出内容。
将以下内容作为端到端示例:
git rev-list --all \
| xargs -d $'\n' -n 1 git ls-tree --full-tree -r \
| awk '/Foo/ { print $3 }' \
| git cat-file --batch