Spec-Zone.ru › Git

git-cat-file

Имя

git-cat-file — вывод содержимого или сведений об объектах репозитория

Синтаксис

git cat-file <type> <object>
git cat-file (-e | -p | -t | -s) <object>
git cat-file (--textconv | --filters)
             [<rev>:<path|tree-ish> | --path=<path|tree-ish> <rev>]
git cat-file (--batch | --batch-check | --batch-command) [--batch-all-objects]
             [--buffer] [--follow-symlinks] [--unordered]
             [--textconv | --filters] [-Z]

Описание

Выводит содержимое или другие свойства одного или нескольких объектов, например размер, тип или сведения о дельте.

Эта команда может работать в двух режимах в зависимости от того, указан ли параметр из семейства --batch.

В пакетном режиме команда предоставляет сведения об объекте, указанном в командной строке.

В пакетном режиме аргументы считываются из стандартного ввода.

Параметры

<object>

Имя объекта, сведения о котором нужно показать. Полный список способов записи имён объектов см. в разделе «SPECIFYING REVISIONS» справки gitrevisions[7].

-t

Вместо содержимого показывает тип объекта, заданного параметром <object>.

-s

Вместо содержимого показывает размер объекта, заданного параметром <object>. При использовании с параметром --use-mailmap будет показан размер обновлённого объекта после замены ident с помощью механизма mailmap.

-e

Завершает работу с нулевым кодом возврата, если <object> существует и является допустимым объектом. Если <object> имеет недопустимый формат, завершает работу с ненулевым кодом возврата и выводит сообщение об ошибке в stderr.

-p

Выводит содержимое <object> в удобочитаемом формате в зависимости от его типа.

<type>

Обычно это соответствует фактическому типу <object>, но также разрешено запросить тип, который можно без труда разыменовать из указанного <object>. Например, можно запросить «tree», указав в <object> объект-коммит, содержащий это дерево, или запросить «blob», указав объект-тег, ссылающийся на него.

--mailmap
--no-mailmap
--use-mailmap
--no-use-mailmap

Использует файл mailmap для сопоставления имён и адресов электронной почты автора, коммитера и создателя тега с каноническими настоящими именами и адресами электронной почты. См. git-shortlog[1].

--textconv

Показывает содержимое после преобразования фильтром textconv. В этом случае параметр <object> должен иметь вид <tree-ish>:<path> или :<path>, чтобы применить фильтр к содержимому, записанному в индексе по пути <path>.

--filters

Показывает содержимое после преобразования фильтрами, настроенными в текущем рабочем дереве для указанного пути <path> (например, фильтрами smudge, преобразованием конца строки и т. д.). В этом случае параметр <object> должен иметь вид <tree-ish>:<path> или :<path>.

--filter=<filter-spec>
--no-filter

Исключает объекты из списка выводимых объектов. Этот параметр можно использовать только вместе с одним из пакетных режимов. Исключённые объекты, явно запрошенные с помощью любого пакетного режима, считывающего объекты из стандартного ввода (--batch, --batch-check), будут помечены как «отфильтрованные». Исключённые объекты в режиме --batch-all-objects вообще не будут выведены. Значение <filter-spec> может быть одним из следующих:

Форма --filter=blob:none исключает все блобы.

Форма --filter=blob:limit=<n>[kmg] исключает блобы размером не менее n байт или единиц измерения. Значение n может быть равно нулю. Суффиксы k, m и g обозначают единицы измерения KiB, MiB и GiB. Например, blob:limit=1k эквивалентно blob:limit=1024.

Форма --filter=object:type=(tag|commit|tree|blob) исключает все объекты, тип которых не совпадает с запрошенным.

--path=<path>

Используется с --textconv или --filters, чтобы задать имя объекта и путь отдельно, например, если трудно определить ревизию, из которой был получен blob.

--batch
--batch=<format>

Выводит сведения об объекте и его содержимое для каждого объекта, переданного через stdin. Нельзя использовать вместе с другими параметрами или аргументами, кроме --textconv, --filters или --use-mailmap.

  • При использовании с --textconv или --filters во входных строках необходимо указывать путь, отделённый пробелом. Подробности см. в разделе BATCH OUTPUT ниже.

  • При использовании с --use-mailmap для объектов-коммитов и объектов-тегов часть вывода с содержимым показывает идентификаторы, заменённые с помощью механизма mailmap, а часть со сведениями показывает размер объекта, как если бы в нём действительно были записаны заменённые идентификаторы.

--batch-check
--batch-check=<format>

Выводит сведения об объекте для каждого объекта, переданного через stdin. Нельзя использовать вместе с другими параметрами или аргументами, кроме --textconv, --filters или --use-mailmap.

  • При использовании с --textconv или --filters во входных строках необходимо указывать путь, отделённый пробелом. Подробности см. в разделе BATCH OUTPUT ниже.

  • При использовании с --use-mailmap для объектов-коммитов и объектов-тегов выводимые сведения об объекте показывают его размер, как если бы записанные в нём идентификаторы были заменены механизмом mailmap.

--batch-command
--batch-command=<format>

Переходит в командный режим, в котором команды и аргументы считываются из stdin. Можно использовать только вместе с --buffer, --textconv, --use-mailmap или --filters.

  • При использовании с --textconv или --filters во входных строках необходимо указывать путь, отделённый пробелом. Подробности см. в разделе BATCH OUTPUT ниже.

  • При использовании с --use-mailmap для объектов-коммитов и объектов-тегов команда contents показывает идентификаторы, заменённые с помощью механизма mailmap, а команда info показывает размер объекта, как если бы в нём действительно были записаны заменённые идентификаторы.

--batch-command распознаёт следующие команды:

contents <object>

Выводит содержимое объекта, на который ссылается <object>. Соответствует выводу команды --batch.

info <object>

Выводит сведения об объекте, на который ссылается <object>. Соответствует выводу команды --batch-check.

flush

Используется с --buffer для выполнения всех предшествующих команд, поступивших с начала работы или с момента последнего вызова flush. При использовании --buffer вывод не появится, пока не будет вызвана команда flush. Если --buffer не используется, команды сбрасываются каждый раз без вызова flush.

mailmap (<bool>)

Включает или отключает mailmap для последующих команд. Аргумент <bool> принимает те же логические значения, что и git-config[1]. Данные mailmap считываются при первом использовании и только один раз.

--batch-all-objects

Вместо считывания списка объектов из stdin выполняет запрошенную пакетную операцию над всеми объектами репозитория и всеми альтернативными хранилищами объектов (а не только над достижимыми объектами). Требует указания --batch или --batch-check. По умолчанию объекты обходятся в порядке сортировки по хешам; см. также раздел --unordered ниже. Объекты предоставляются как есть, без учёта механизма «replace» команды git-replace[1].

--buffer

Обычно пакетный вывод сбрасывается после вывода каждого объекта, чтобы процесс мог интерактивно считывать данные из cat-file и записывать их туда. С этим параметром вывод использует обычную буферизацию stdio; это значительно эффективнее при вызове --batch-check или --batch-command для большого числа объектов.

--unordered

Если используется --batch-all-objects, объекты обходятся в порядке, который может быть более эффективным для доступа к их содержимому, чем порядок по хешам. Точный порядок не определён, но если конкретный порядок не важен, это обычно ускоряет вывод, особенно с --batch. Обратите внимание: cat-file по-прежнему выводит каждый объект только один раз, даже если он хранится в репозитории несколько раз.

--follow-symlinks

При использовании с --batch или --batch-check следует по символическим ссылкам внутри репозитория при запросе объектов с расширенными выражениями SHA-1 вида tree-ish:path-in-tree. Вместо вывода сведений о самой ссылке выводит сведения об объекте, на который она указывает. Если символическая ссылка указывает за пределы tree-ish (например, на /foo или корневая ссылка указывает на ../foo), будет выведена часть пути ссылки, находящаяся за пределами дерева.

В настоящее время этот параметр работает некорректно, если указан объект в индексе (например, :link вместо HEAD:link), а не объект в дереве.

В настоящее время этот параметр можно использовать только вместе с --batch или --batch-check.

Например, рассмотрим репозиторий Git, содержащий:

f: a file containing "hello\n"
link: a symlink to f
dir/link: a symlink to ../f
plink: a symlink to ../f
alink: a symlink to /etc/passwd

Для обычного файла f команда echo HEAD:f | git cat-file --batch выведет

ce013625030ba8dba906f756967f9e9ca394464a blob 6

Команда echo HEAD:link | git cat-file --batch --follow-symlinks выведет то же самое, как и HEAD:dir/link, поскольку обе указывают на HEAD:f.

Без --follow-symlinks эти команды выводили бы данные о самой символической ссылке. В случае HEAD:link вы увидите

4d1ae35ba2c8ec712fa2a379db44ad639ca277bd blob 1

Обе ссылки — plink и alink — указывают за пределы дерева, поэтому они выведут соответственно:

symlink 4
../f
symlink 11
/etc/passwd
-Z

Имеет смысл только с --batch, --batch-check или --batch-command; входные и выходные данные разделяются нулевыми байтами, а не символами новой строки.

-z

Имеет смысл только с --batch, --batch-check или --batch-command; входные данные разделяются нулевыми байтами, а не символами новой строки. Этот параметр устарел; вместо него следует использовать -Z, поскольку в противном случае вывод может быть неоднозначным.

Вывод

Если указан параметр -t, выводится один из типов <type>.

Если указан параметр -s, выводится размер <object> в байтах.

Если указан параметр -e, вывод отсутствует, если только <object> не повреждён.

Если указан параметр -p, содержимое <object> выводится в удобочитаемом формате.

Если указан параметр <type>, возвращается необработанное (но несжатое) содержимое <object>.

Пакетный вывод

Если указан --batch или --batch-check, cat-file будет считывать объекты из stdin, по одному в строке, и выводить сведения о них в том же порядке, в котором они были прочитаны. По умолчанию вся строка считается объектом, как если бы она была передана команде git-rev-parse[1].

Если указан --batch-command, cat-file будет считывать команды из stdin, по одной в строке, и выводить сведения в соответствии с заданной командой. При использовании --batch-command команда info с последующим указанием объекта выведет сведения об объекте так же, как это сделала бы команда --batch-check, а команда contents с последующим указанием объекта выведет его содержимое так же, как это сделала бы команда --batch.

Можно указать, какие сведения выводить для каждого объекта, с помощью пользовательского параметра <format>. Параметр <format> дословно копируется в stdout для каждого объекта; подстановки вида %(atom) заменяются соответствующими значениями, после чего выводится символ новой строки. Доступны следующие атомы:

objectname

Полное шестнадцатеричное представление имени объекта.

objecttype

Тип объекта (совпадает со значением, выводимым командой cat-file -t).

objectmode

Если для указанного объекта доступны сведения о режиме (например, для дерева или записи индекса), режим в виде восьмеричного целого числа. В противном случае — пустая строка.

objectsize

Размер объекта в байтах (совпадает со значением, выводимым командой cat-file -s).

objectsize:disk

Размер объекта на диске в байтах. См. примечание о размерах на диске в разделе CAVEATS ниже.

deltabase

Если объект хранится на диске в виде дельты, подставляется полное шестнадцатеричное представление имени базового объекта этой дельты. В противном случае подставляется нулевой OID (состоящий из одних нулей). См. CAVEATS ниже.

rest

Если этот атом используется в строке вывода, входные строки разделяются по первому пробельному символу. Все символы до этого пробела считаются именем объекта; символы после первой последовательности пробелов (то есть «остаток» строки) выводятся вместо атома %(rest).

Если формат не указан, используется формат по умолчанию: %(objectname) %(objecttype) %(objectsize).

Если указан --batch или если --batch-command используется с командой contents, за сведениями об объекте следует его содержимое (состоящее из %(objectsize) байт), а затем символ новой строки.

Например, команда --batch без пользовательского формата выведет:

<oid> SP <type> SP <size> LF
<contents> LF

Тогда как команда --batch-check='%(objectname) %(objecttype) выведет:

<oid> SP <type> LF

Если указанное в stdin имя невозможно разрешить в объект репозитория, cat-file проигнорирует любой пользовательский формат и выведет:

<object> SP missing LF

Если указанное в stdin имя отфильтровано с помощью --filter=, cat-file проигнорирует любой пользовательский формат и выведет:

<object> SP excluded LF

Если указанное имя может ссылаться более чем на один объект (неоднозначный короткий SHA), cat-file проигнорирует любой пользовательский формат и выведет:

<object> SP ambiguous LF

Если указанное имя относится к записи подмодуля в дереве, а целевой объект отсутствует в репозитории, cat-file проигнорирует любой пользовательский формат и выведет (с идентификатором объекта подмодуля):

<oid> SP submodule LF

Если используется --follow-symlinks и символическая ссылка в репозитории указывает за пределы репозитория, cat-file проигнорирует любой пользовательский формат и выведет:

symlink SP <size> LF
<symlink> LF

Символическая ссылка может быть абсолютной (начинаться с /) или относительной к корню дерева. Например, если dir/link указывает на ../../foo, то <symlink> будет равен ../foo. Значение <size> — размер символической ссылки в байтах.

Если используется --follow-symlinks, будут выведены следующие сообщения об ошибках:

<object> SP missing LF

выводится, если исходная запрошенная символическая ссылка не существует.

dangling SP <size> LF
<object> LF

выводится, если исходная символическая ссылка существует, но не существует объект, на который она (непосредственно или через цепочку ссылок) указывает.

loop SP <size> LF
<object> LF

выводится при циклических символических ссылках (или если для разрешения ссылки требуется более 40 переходов).

notdir SP <size> LF
<object> LF

выводится, если при разрешении символической ссылки файл используется как имя каталога.

Кроме того, если указан параметр -Z, символы перевода строки во всех приведённых выше примерах заменяются нулевыми терминаторами. Это гарантирует, что вывод можно будет разобрать, даже если он сам содержит символ перевода строки; поэтому такой вариант рекомендуется для сценариев.

Замечания

Обратите внимание: размеры объектов на диске указываются точно, однако следует с осторожностью делать выводы о том, какие ссылки или объекты отвечают за использование дискового пространства. Размер упакованного объекта, не являющегося дельтой, может быть значительно больше размера объектов, представляющих собой дельту относительно него, но выбор того, какой объект будет базовым, а какой — дельтой, произволен и может меняться при переупаковке.

Также обратите внимание, что в базе объектов могут присутствовать несколько копий одного объекта; в этом случае не определено, размер какой копии или база какой дельты будут указаны.

cat-file

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-cat-file

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API