Как мне получить доступ к файлу из ответа git ls-tree?

#git

#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 .

Как мне просмотреть содержимое этого файла?

Комментарии:

1. git cat-file blob <blob> . То есть не передавайте его Assets/Editor/Foo.cs.meta , передайте его 33265039940178412e18a8654bef5c31fa9694b5

Ответ №1:

По идентификатору хэша:

 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 флаг to git cat-file здесь на самом деле не нужен, но это важно при проверке объекта tree, поскольку они хранятся в виде двоичных данных. Вы можете принудительно указать ожидаемый тип объекта git или просто позволить -p выяснить, как его отобразить.)

Ответ №2:

Для вашего примера, git cat-file blob 33265039940178412e18a8654bef5c31fa9694b5 вернет содержимое Assets/Editor/Foo.cs.meta , вообще ничего не нужно делать git checkout .

Еще лучше, git cat-file --batch можно предоставить поток идентификаторов в stdin и будет выдавать содержимое из каждого из них.

Рассмотрим следующее в качестве сквозного примера:

 git rev-list --all 
  | xargs -d $'n' -n 1 git ls-tree --full-tree -r 
  | awk '/Foo/ { print $3 }' 
  | git cat-file --batch