如何从git ls-tree响应中收集文件?

时间:2019-03-19 20:41:04

标签: git

我在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

我如何查看该文件的内容?

2 个答案:

答案 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