#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