Русский ▾ Topics ▾ Latest version ▾ git-cat-file last updated in 2.52.0

НАЗВАНИЕ

git-cat-file — Предоставить содержимое или детали объектов репозитория

ОБЗОР

git cat-file <тип> <объект>
git cat-file (-e | -p | -t | -s) <объект>
git cat-file (--textconv | --filters)
	     [<ред>:<путь|указатель-дерева> | --path=<путь|указатель-дерева> <ред>]
git cat-file (--batch | --batch-check | --batch-command) [--batch-all-objects]
	     [--buffer] [--follow-symlinks] [--unordered]
	     [--textconv | --filters] [-Z]

ОПИСАНИЕ

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

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

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

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

ПАРАМЕТРЫ

<объект>

Имя объекта для отображения. Более полный список способов написания имён объектов см. в разделе "ЗАДАНИЕ РЕВИЗИЙ" в gitrevisions[7].

-t

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

-s

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

-e

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

-p

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

<type>

Обычно это соответствует реальному типу <объекта>, но также разрешено запрашивать тип, который может быть тривиально разыменован из данного <объекта>. Примером является запрос "дерева", где <объект> является объектом коммита, который его содержит, или запрос "blob-объекта", где <объект> является объектом метки, который указывает на него.

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

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

--textconv

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

--filters

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

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

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

Форма --filter=blob:none опускает все blob-объекты.

Форма --filter=blob:limit=<n>[kmg] опускает blob-объекты размером не менее n байт или единиц. n может быть нулём. Суффиксы k, m и g можно использовать для обозначения единиц в КиБ, МиБ или ГиБ. Например, 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 строки ввода должны указывать путь, разделённый пробелами. Подробности см. в разделе ПАКЕТНЫЙ ВЫВОД ниже.

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

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

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

  • При использовании с --textconv или --filters строки ввода должны указывать путь, разделённый пробелами. Подробности см. в разделе ПАКЕТНЫЙ ВЫВОД ниже.

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

--batch-command
--batch-command=<формат>

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

  • При использовании с --textconv или --filters строки ввода должны указывать путь, разделённый пробелами. Подробности см. в разделе ПАКЕТНЫЙ ВЫВОД ниже.

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

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

contents <объект>

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

info <объект>

Выводит информацию об объекте для ссылки на объект <объект>. Это соответствует выводу --batch-check.

flush

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

--batch-all-objects

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

--buffer

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

--unordered

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

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

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

Этот параметр (в настоящее время) нельзя использовать, если не используется --batch или --batch-check.

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

f: файл, содержащий "hello\n"
link: символьная ссылка на f
dir/link: символьная ссылка на ../f
plink: символьная ссылка на ../f
alink: символьная ссылка на /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; ввод и вывод разделяется NUL вместо символа новой строки.

-z

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

ВЫВОД

Если указан -t, один из <тип>.

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

Если указан -e, вывода нет, если только <объект> не имеет неверный формат.

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

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

ПАКЕТНЫЙ ВЫВОД

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

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

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

objectname

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

objecttype

Тип объекта (тот же, который сообщает cat-file -t).

objectmode

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

objectsize

Размер объекта в байтах (тот же, который сообщает cat-file -s).

objectsize:disk

Размер, в байтах, который объект занимает на диске. См. примечание о размерах на диске в разделе ПРЕДОСТЕРЕЖЕНИЯ ниже.

deltabase

Если объект хранится на диске в виде дельты, раскрывается в полное шестнадцатеричное представление имени базового объекта дельты. В противном случае раскрывается в нулевой OID (все нули). См. ПРЕДОСТЕРЕЖЕНИЯ ниже.

rest

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

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

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

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

<oid> SP <тип> SP <размер> LF
<содержимое> LF

В то время как --batch-check='%(objectname) %(objecttype) выдаст:

<oid> SP <тип> LF

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

<объект> SP missing LF

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

<объект> SP excluded LF

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

<объект> SP ambiguous LF

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

<oid> SP submodule LF

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

symlink SP <размер> LF
<символьная-ссылка> LF

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

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

<объект> SP missing LF

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

dangling SP <размер> LF
<объект> LF

выводится, когда начальная символьная ссылка существует, но то, на что она (транзитивно) указывает, не существует.

loop SP <размер> LF
<объект> LF

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

notdir SP <размер> LF
<объект> LF

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

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

ПРЕДУПРЕЖДЕНИЯ

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

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

GIT

Является частью пакета git[1]