Spec-Zone.ru › Git

git-for-each-ref

Имя

git-for-each-ref — вывод информации о каждой ссылке

Синопсис

git for-each-ref [--count=<count>] [--shell|--perl|--python|--tcl]
                   [(--sort=<key>)…​] [--format=<format>]
                   [--include-root-refs] [--points-at=<object>]
                   [--merged[=<object>]] [--no-merged[=<object>]]
                   [--contains[=<object>]] [--no-contains[=<object>]]
                   [(--exclude=<pattern>)…​] [--start-after=<marker>]
                   [ --stdin | (<pattern>...)]

Описание

Перебирает все ссылки, соответствующие <pattern>, и выводит их в соответствии с заданным <format>, предварительно отсортировав их согласно заданному набору <key>. Если задано <count>, вывод прекращается после отображения указанного количества ссылок. Интерполированные значения в <format> при необходимости можно заключить в кавычки как строковые литералы на указанном языке-хосте, что позволяет напрямую вычислить их на этом языке.

Параметры

<pattern>...

Если задан один или несколько параметров <pattern>, выводятся только ссылки, соответствующие хотя бы одному шаблону — с использованием fnmatch(3) или буквально; во втором случае совпадение должно быть полным либо начинаться с начала строки и заканчиваться косой чертой.

--stdin

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

--count=<count>

Прекратить вывод после отображения <count> ссылок.

--sort=<key>

Сортировать по имени поля <key>. Добавьте префикс -, чтобы сортировать значения в порядке убывания. Если параметр не указан, используется refname. Параметр --sort=<key> можно использовать несколько раз; в этом случае последний ключ становится основным.

--format[=<format>]

Строка, которая подставляет значения %(fieldname) из отображаемой ссылки и объекта, на который она указывает. Кроме того, строковый литерал %% преобразуется в %, а %xx, где xx — шестнадцатеричные цифры, — в символ с шестнадцатеричным кодом xx. Например, %00 подставляется как \0 (NUL), %09 — как \t (TAB), а %0a — как \n (LF).

Если параметр <format> не указан, по умолчанию используется %(objectname) SPC %(objecttype) TAB %(refname).

--color[=<when>]

Учитывать цвета, указанные в параметре --format. Поле <when> должно принимать одно из значений: always, never или auto (если <when> отсутствует, поведение такое же, как при указании always).

--shell
--perl
--python
--tcl

Если параметр задан, строки, подставляемые вместо заполнителей %(fieldname), заключаются в кавычки как строковые литералы, подходящие для указанного языка-хоста. Это позволяет создать фрагмент скрипта, который можно напрямую выполнить с помощью «eval».

--points-at=<object>

Выводить только ссылки, указывающие на заданный объект.

--merged[=<object>]

Выводить только ссылки, вершины которых достижимы из указанного коммита (если он не задан, используется HEAD).

--no-merged[=<object>]

Выводить только ссылки, вершины которых недостижимы из <object> (если он не задан, используется HEAD).

--contains[=<object>]

Выводить только ссылки, содержащие <object> (если он не задан, используется HEAD).

--no-contains[=<object>]

Выводить только ссылки, не содержащие <object> (если он не задан, используется HEAD).

--ignore-case

Сортировать и фильтровать ссылки без учета регистра.

--omit-empty

Не выводить символ новой строки после ссылок, для которых формат преобразуется в пустую строку.

--exclude=<excluded-pattern>

Если задан один или несколько параметров --exclude, выводятся только ссылки, не соответствующие ни одному параметру <excluded-pattern>. Сопоставление выполняется по тем же правилам, что и для <pattern> выше.

--include-root-refs

Выводить корневые ссылки (HEAD и псевдоссылки) вместе с обычными ссылками.

--start-after=<marker>

Позволяет разбивать вывод на страницы, пропуская ссылки до указанного маркера включительно. При постраничном выводе следует учитывать, что между вызовами ссылки могут быть удалены, изменены или добавлены. В вывод попадут только ссылки, расположенные после маркера в лексикографическом порядке. Вывод начинается с первой ссылки, которая следовала бы за маркером в алфавитном порядке. Нельзя использовать вместе с параметрами --sort=<key> или --stdin, а также с аргументами <pattern>, ограничивающими список ссылок.

Имена полей

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

Для всех объектов можно использовать следующие имена:

refname

Имя ссылки (часть после $GIT_DIR/). Чтобы получить однозначное короткое имя ссылки, добавьте :short. Для выбора строгого режима сокращения используется параметр core.warnAmbiguousRefs. Если добавлено lstrip=<n> (rstrip=<n>), удалите <n> разделённых косой чертой компонентов пути из начала (конца) имени ссылки (например, %(refname:lstrip=2) преобразует refs/tags/foo в foo, а %(refname:rstrip=2) преобразует refs/tags/foo в refs). Если <n> — отрицательное число, удаляется необходимое количество компонентов пути с указанного конца, чтобы осталось -<n> компонентов пути (например, %(refname:lstrip=-2) преобразует refs/tags/foo в tags/foo, а %(refname:rstrip=-1) преобразует refs/tags/foo в refs). Если у ссылки недостаточно компонентов, результатом будет пустая строка при удалении с положительным <n> или полное имя ссылки при удалении с отрицательным <N>. Ни один из этих случаев не считается ошибкой.

strip можно использовать как синоним lstrip.

objecttype

Тип объекта (blob, tree, commit, tag).

objectsize

Размер объекта (тот же, что сообщает git cat-file -s). Добавьте :disk, чтобы получить размер объекта в байтах на диске. См. примечание о размерах на диске в разделе CAVEATS ниже.

objectname

Имя объекта (также называемое SHA-1). Чтобы получить однозначное сокращение имени объекта, добавьте :short. Чтобы задать желаемую длину сокращения имени объекта, добавьте :short=<length>, где минимальная длина — MINIMUM_ABBREV. Длина может быть увеличена, чтобы обеспечить уникальность имён объектов.

deltabase

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

upstream

Имя локальной ссылки, которую можно считать «вышестоящей» для отображаемой ссылки. Поддерживает параметры :short, :lstrip и :rstrip так же, как описанный выше параметр refname. Кроме того, поддерживает :track, который выводит «[ahead N, behind M]», и :trackshort, который выводит сокращённую версию: «>» (впереди), «<» (позади), «<>» (впереди и позади) или «=» (синхронизирована). :track также выводит «[gone]», если обнаружена неизвестная вышестоящая ссылка. Добавьте :track,nobracket, чтобы вывести сведения об отслеживании без скобок (т. е. «ahead N, behind M»).

Для любой ветки отслеживания удалённого репозитория %(upstream), %(upstream:remotename) и %(upstream:remoteref) относятся соответственно к имени удалённого репозитория и имени отслеживаемой ссылки удалённого репозитория. Иными словами, ветку отслеживания удалённого репозитория можно обновить явно и отдельно, используя спецификацию ссылки %(upstream:remoteref):%(upstream) для получения данных из %(upstream:remotename).

Не действует, если для ссылки не заданы сведения об отслеживании. Все параметры, кроме nobracket, взаимоисключающие; если указано несколько, выбирается последний.

push

Имя локальной ссылки, представляющей расположение @{push} для отображаемой ссылки. Поддерживает параметры :short, :lstrip, :rstrip, :track, :trackshort, :remotename и :remoteref так же, как upstream. Выводит пустую строку, если ссылка @{push} не настроена.

HEAD

*, если HEAD соответствует текущей ссылке (извлечённой ветке), и ' ' в противном случае.

color

Изменить цвет вывода. За ним следует :<colorname>; названия цветов описаны в разделе «ЗНАЧЕНИЯ» раздела «ФАЙЛ КОНФИГУРАЦИИ» в git-config[1]. Например, %(color:bold red).

align

Выровнять содержимое между %(align:...) и %(end) по левому краю, по центру или по правому краю. За «align:» следуют width=<width> и position=<position> в любом порядке, разделённые запятой; <position> может принимать значения left, right или middle, по умолчанию используется left, а <width> — общая длина выровненного содержимого. Для краткости префиксы «width=» и/или «position=» можно опустить и использовать только <width> и <position>. Например: %(align:<width>,<position>). Если длина содержимого превышает ширину, выравнивание не выполняется. При использовании с --quote всё содержимое между %(align:...) и %(end) экранируется; при вложенности экранирование выполняется только на верхнем уровне.

if

Используется в форме %(if)...%(then)...%(end) или %(if)...%(then)...%(else)...%(end). Если после атома %(if) есть атом со значением или строковый литерал, выводится всё содержимое после %(then); если же используется атом %(else), выводится всё содержимое после %(else). При вычислении строки перед %(then) пробелы игнорируются. Это полезно, когда используется атом %(HEAD), выводящий либо «*», либо « », и нужно применить условие if только к ссылке HEAD. Добавьте «:equals=<string>» или «:notequals=<string>», чтобы сравнить значение между атомами %(if:...) и %(then) с заданной строкой.

symref

Ссылка, на которую указывает заданная символическая ссылка. Если это не символическая ссылка, ничего не выводится. Поддерживает параметры :short, :lstrip и :rstrip так же, как описанный выше параметр refname.

signature

Подпись GPG коммита.

signature:grade

Выводит

G

для хорошей (действительной) подписи

B

для недействительной подписи

U

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

X

для действительной подписи с истёкшим сроком действия

Y

для действительной подписи, созданной просроченным ключом

R

для действительной подписи, созданной отозванным ключом

E

если подпись не удалось проверить (например, отсутствует ключ)

N

если подписи нет.

signature:signer

Подписавший подписью GPG автор коммита.

signature:key

Ключ подписи GPG коммита.

signature:fingerprint

Отпечаток подписи GPG коммита.

signature:primarykeyfingerprint

Отпечаток первичного ключа подписи GPG коммита.

signature:trustlevel

Уровень доверия к подписи GPG коммита. Возможные значения: ultimate, fully, marginal, never и undefined.

worktreepath

Абсолютный путь к рабочему дереву, в котором извлечена ссылка, если она извлечена в каком-либо связанном рабочем дереве. В противном случае — пустая строка.

ahead-behind:<commit-ish>

Два целых числа, разделённых пробелом, показывающие соответственно количество коммитов впереди и позади при сравнении выводимой ссылки с <committish>, указанным в формате.

is-base:<commit-ish>

Не более чем в одной строке будет указано (<commit-ish>), обозначающее ссылку, которая, скорее всего, использовалась как начальная точка ветки, породившей <commit-ish>. Выбор делается с помощью эвристики: выбирается ссылка, для которой количество коммитов в истории по первым родителям <commit-ish>, отсутствующих в истории по первым родителям этой ссылки, минимально.

Например, рассмотрим следующий рисунок историй по первым родителям нескольких ссылок:

*--*--*--*--*--* refs/heads/A
\
 \
  *--*--*--* refs/heads/B
   \     \
    \     \
     *     * refs/heads/C
      \
       \
        *--* refs/heads/D

Здесь, если A, B и C — отфильтрованные ссылки, а строка формата — %(refname):%(is-base:D), то результат будет таким:

refs/heads/A:
refs/heads/B:(D)
refs/heads/C:

Это объясняется тем, что история по первым родителям ссылки D впервые пересекается с историями по первым родителям отфильтрованных ссылок в общем предке по первым родителям ссылок B и C; при равенстве выбирается ссылка, стоящая раньше в отсортированном порядке.

Обратите внимание: этот токен не появится, если история по первым родителям <commit-ish> не пересекается с историями по первым родителям отфильтрованных ссылок.

describe[:<option>,...]

Удобочитаемое имя, аналогичное имени, выдаваемому git-describe[1]; для коммитов, которым нельзя назначить описание, выводится пустая строка. После строки describe могут следовать двоеточие и один или несколько параметров, разделённых запятыми.

tags=<bool-value>

Помимо аннотированных тегов учитывать также лёгкие теги; подробности см. в соответствующем параметре git-describe[1].

abbrev=<number>

Использовать не менее <number> шестнадцатеричных цифр; подробности см. в соответствующем параметре git-describe[1].

match=<pattern>

Учитывать только теги, соответствующие <pattern> glob(7), без префикса refs/tags/; подробности см. в соответствующем параметре git-describe[1].

exclude=<pattern>

Не учитывать теги, соответствующие <pattern> glob(7), без префикса refs/tags/; подробности см. в соответствующем параметре git-describe[1].

Кроме перечисленного выше, для объектов коммитов и тегов можно использовать имена полей заголовка (tree, parent, object, type и tag), чтобы указать значение поля заголовка. К полям tree и parent также можно применять модификаторы :short и :short=<length>, как и к objectname.

Для объектов коммитов и тегов специальные поля creatordate и creator соответствуют нужной дате или кортежу «имя-адрес электронной почты-дата» из полей committer или tagger в зависимости от типа объекта. Они предназначены для работы с сочетанием аннотированных и лёгких тегов.

Для объектов тегов поле fieldname, перед которым стоит звёздочка (*), раскрывается в значение fieldname разыменованного объекта, а не самого объекта-тега.

К полям, значением которых является кортеж «имя-адрес электронной почты-дата» (author, committer и tagger), можно добавить суффиксы name, email и date, чтобы извлечь соответствующий компонент. Для полей адреса электронной почты (authoremail, committeremail и taggeremail) можно добавить :trim, чтобы получить адрес без угловых скобок, и :localpart, чтобы получить часть обрезанного адреса до символа @. Кроме того, можно использовать параметр :mailmap и соответствующие ему :mailmap,trim и :mailmap,localpart (порядок не важен), чтобы получить имя и адрес электронной почты согласно файлу .mailmap или файлу, указанному в переменной конфигурации mailmap.file или mailmap.blob (см. gitmailmap[5]).

Необработанные данные объекта — это raw.

raw:size

Размер необработанных данных объекта.

Обратите внимание, что --format=%(raw) нельзя использовать с --python, --shell, --tcl, поскольку такие языки могут не поддерживать произвольные двоичные данные в строковых переменных.

Сообщение в объекте коммита или тега — это contents; с помощью contents:<part> можно извлечь из него различные части:

contents:size

Размер сообщения коммита или тега в байтах.

contents:subject

Первый абзац сообщения, обычно состоящий из одной строки, считается «темой» коммита или сообщения тега. Вместо contents:subject для получения того же результата можно использовать поле subject. К subject можно добавить :sanitize, чтобы получить строку темы, подходящую для имени файла.

contents:body

Остаток сообщения коммита или тега после «темы».

contents:signature

Необязательная подпись GPG тега.

contents:lines=<n>

Первые <n> строк сообщения.

Кроме того, трейлеры в интерпретации git-interpret-trailers[1] доступны как trailers[:<option>,...] (или с помощью исторического псевдонима contents:trailers[:<option>,...]). Допустимые значения <option> см. в разделе trailers справки git-log[1].

При сортировке поля с числовыми значениями сортируются по числовому значению (objectsize, authordate, committerdate, creatordate, taggerdate). Все остальные поля сортируются в порядке байтовых значений.

Также можно сортировать по версиям, используя имя поля version:refname или его псевдоним v:refname.

В любом случае, если имя поля указывает на поле, неприменимое к объекту, на который ссылается ссылка, это не приводит к ошибке. Вместо этого возвращается пустая строка.

Для полей типа даты можно задать формат даты, добавив :, за которым следует название формата даты (см. значения, принимаемые параметром --date команды git-rev-list[1]). Если такое форматирование задано для ключа --sort, ссылки будут сортироваться по байтовому значению отформатированной строки, а не по числовому значению исходной временной метки.

Для некоторых атомов, например %(align) и %(if), обязательно требуется соответствующий %(end). Мы называем их «открывающими атомами» и иногда обозначаем как %($open).

Если используется специфичное для языка сценариев экранирование, всё содержимое между открывающим атомом верхнего уровня и соответствующим ему %(end) вычисляется согласно семантике открывающего атома, и экранируется только результат верхнего уровня.

Примеры

Пример непосредственного вывода форматированного текста. Показать последние 3 коммита с тегами:

#!/bin/sh

git for-each-ref --count=3 --sort='-*authordate' \
`--format='From: %(*authorname) %(*authoremail)
Subject: %(*subject)
Date: %(*authordate)
Ref: %(*refname)

%(*body)
' 'refs/tags'

Простой пример применения shell eval к выводу, демонстрирующий использование --shell. Вывести префиксы всех веток:

#!/bin/sh

git for-each-ref --shell --format="ref=%(refname)" refs/heads | \
while read entry
do
        eval "$entry"
        echo `dirname $ref`
done

Более подробный отчёт о тегах, демонстрирующий, что формат может представлять собой целый сценарий:

#!/bin/sh

fmt='
        r=%(refname)
        t=%(*objecttype)
        T=${r#refs/tags/}

        o=%(*objectname)
        n=%(*authorname)
        e=%(*authoremail)
        s=%(*subject)
        d=%(*authordate)
        b=%(*body)

        kind=Tag
        if test "z$t" = z
        then
                # could be a lightweight tag
                t=%(objecttype)
                kind="Lightweight tag"
                o=%(objectname)
                n=%(authorname)
                e=%(authoremail)
                s=%(subject)
                d=%(authordate)
                b=%(body)
        fi
        echo "$kind $T points at a $t object $o"
        if test "z$t" = zcommit
        then
                echo "The commit was authored by $n $e
at $d, and titled

    $s

Its message reads as:
"
                echo "$b" | sed -e "s/^/    /"
                echo
        fi
'

eval=`git for-each-ref --shell --format="$fmt" \
        --sort='*objecttype' \
        --sort=-taggerdate \
        refs/tags`
eval "$eval"

Пример использования %(if)...%(then)...%(else)...%(end). Этот формат добавляет звёздочку перед текущей веткой.

git for-each-ref --format="%(if)%(HEAD)%(then)* %(else)  %(end)%(refname:short)" refs/heads/

Пример использования %(if)...%(then)...%(end). Выводит имя автора, если оно указано.

git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Authored by: %(authorname)%(end)"

Предостережения

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

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

Примечания

При объединении нескольких фильтров --contains и --no-contains отображаются только ссылки, которые содержат как минимум один из коммитов --contains и не содержат ни одного коммита --no-contains.

При объединении нескольких фильтров --merged и --no-merged отображаются только ссылки, достижимые как минимум из одного коммита --merged и недостижимые ни из одного коммита --no-merged.

См. также

git-show-ref[1]

for-each-ref

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

Spec-Zone.ru

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