我在我的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
。
如何查看该文件的内容?
按哈希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
的git cat-file
标志在这里并不是必需的,但是在检查树对象时这很重要,因为它们存储为二进制数据。你可以强制指定git对象的预期类型,或者让-p
弄清楚如何显示它。)
对于你的例子,git cat-file blob 33265039940178412e18a8654bef5c31fa9694b5
将返回Assets/Editor/Foo.cs.meta
的内容,而不需要做任何git checkout
。
更好的是,git cat-file --batch
可以在stdin上获得一组ID,并从每个中发出内容。
请将以下内容视为端到端示例:
git rev-list --all \
| xargs -d $'\n' -n 1 git ls-tree --full-tree -r \
| awk '/Foo/ { print $3 }' \
| git cat-file --batch