如何从git ls-tree响应中捕获文件?

问题描述 投票:0回答:2

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

如何查看该文件的内容?

git
2个回答
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

(注意:-pgit cat-file标志在这里并不是必需的,但是在检查树对象时这很重要,因为它们存储为二进制数据。你可以强制指定git对象的预期类型,或者让-p弄清楚如何显示它。)


1
投票

对于你的例子,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
© www.soinside.com 2019 - 2024. All rights reserved.