git-interpret-trailers
Имя
git-interpret-trailers — добавление или разбор структурированной информации в сообщениях коммитов
Краткое описание
git interpret-trailers [--in-place] [--trim-empty]
[(--trailer (<key>|<key-alias>)[(=|:)<value>])…]
[--parse] [<file>…] Описание
Добавляет или разбирает строки trailer, похожие на заголовки электронных писем RFC 822, в конце части сообщения коммита, которая в остальном имеет свободный формат. Например, в следующем сообщении коммита
subject Lorem ipsum dolor sit amet, consectetur adipiscing elit. Signed-off-by: Alice <alice@example.com> Signed-off-by: Bob <bob@example.com>
последние две строки, начинающиеся с Signed-off-by, являются строками-трейлерами.
Эта команда считывает сообщения коммитов из аргументов <file> или из стандартного ввода, если <file> не указано. Если указано --parse, вывод содержит разобранные строки-трейлеры из входных данных без изменения под влиянием параметров командной строки или переменных конфигурации.
В противном случае команда применяет переменные конфигурации trailer.<key-alias> (которые могут добавлять новые строки-трейлеры и менять их расположение), а также любые аргументы командной строки, способные переопределять переменные конфигурации (например, --trailer=..., который также может добавлять новые строки-трейлеры), к каждому входному файлу. Результат выводится в стандартный поток вывода.
Эта команда также может обрабатывать вывод git-format-patch[1], который сложнее обычного сообщения коммита. Такой вывод содержит сообщение коммита (как описано выше), строку-разделитель --- и часть с патчем. Для таких входных данных разделитель и части с патчем не изменяются этой командой и выводятся без изменений, если не указан параметр --no-divider.
Некоторые переменные конфигурации управляют тем, как аргументы --trailer применяются к каждому входному файлу и как изменяются уже имеющиеся во входных данных строки-трейлеры. Они также позволяют автоматически добавлять некоторые строки-трейлеры.
По умолчанию аргумент <key>=<value> или <key>:<value>, заданный с помощью --trailer, добавляется после имеющихся строк-трейлеров, только если последняя строка-трейлер имеет другую пару (<key>, <value>) (или если строк-трейлеров нет). Части <key> и <value> обрезаются для удаления начальных и конечных пробелов, а полученные после обрезки <key> и <value> отображаются в выводе следующим образом:
key: value
Это означает, что обрезанные <key> и <value> разделяются строкой «: » (двоеточие, за которым следует пробел).
Для удобства можно настроить <key-alias>, чтобы сократить запись --trailer в командной строке. Для этого используется переменная конфигурации trailer.<key-alias>.key. <key-alias> должен быть префиксом полной строки <key>, регистр символов при этом не имеет значения. Например, если в конфигурации задано
trailer.sign.key "Signed-off-by: "
в командной строке достаточно указать --trailer="sign: foo" вместо --trailer="Signed-off-by: foo".
По умолчанию новая строка-трейлер помещается в конец всех имеющихся строк-трейлеров. Если строк-трейлеров нет, новая строка-трейлер помещается в конец входных данных. Перед новой строкой-трейлером добавляется пустая строка, если ее там еще нет.
Имеющиеся строки-трейлеры извлекаются из входных данных путем поиска группы из одной или нескольких строк, которая (i) целиком состоит из строк-трейлеров или (ii) содержит хотя бы одну строку-трейлер, созданную Git или настроенную пользователем, и как минимум на 25% состоит из строк-трейлеров. Перед группой должна находиться одна или несколько пустых строк (или строк, содержащих только пробельные символы). Группа должна находиться либо в конце входных данных, либо быть последними строками, не содержащими пробельных символов, перед строкой, начинающейся с --- (за которым следует пробел или конец строки).
При чтении строк-трейлеров перед <key> или внутри него не допускаются пробельные символы, однако между <key> и разделителем допускается любое количество обычных пробелов и символов табуляции. Перед <value>, внутри или после него могут находиться пробельные символы. <value> может быть разбит на несколько строк, каждая из которых начинается как минимум с одного пробельного символа, как при «свертывании» строк в RFC 822. Пример:
key: This is a very long value, with spaces and newlines in it.
Обратите внимание, что строки-трейлеры не следуют многим правилам для заголовков RFC 822 и не предназначены для этого. Например, они не следуют правилам кодирования.
Параметры
-
--in-place -
--no-in-place -
Редактировать файлы на месте. По умолчанию используется
--no-in-place. -
--trim-empty -
--no-trim-empty -
Если часть
<value>какой-либо строки-трейлера содержит только пробельные символы, вся строка-трейлер удаляется из вывода. Это относится как к уже имеющимся строкам-трейлерам, так и к новым.По умолчанию используется
--no-trim-empty. -
--trailer=<key>[(=|:)<value>] -
--no-trailer -
Задать пару (
<key>,<value>), которую следует применить к входным данным в качестве строки-трейлера. См. описание этой команды. Параметр можно указать несколько раз.Используйте
--no-trailer, чтобы сбросить список. -
--where=<placement> -
--no-where -
Указать, куда добавлять все новые строки-трейлеры. Значение, заданное с помощью
--where, переопределяетtrailer.whereи все применимые переменные конфигурацииtrailer.<key-alias>.whereи применяется ко всем параметрам--trailerдо следующего вхождения--whereили--no-where. Возможные места размещения:after,before,endилиstart.Используйте
--no-where, чтобы отменить действие всех предыдущих параметров--where, в результате чего соответствующие переменные конфигурации больше не будут переопределяться. -
--if-exists=<action> -
--no-if-exists -
Указать, какое действие выполнять, если во входных данных уже есть хотя бы одна строка-трейлер с таким же
<key>. Значение, заданное с помощью--if-exists, переопределяетtrailer.ifExistsи все применимые переменные конфигурацииtrailer.<key-alias>.ifExistsи применяется ко всем параметрам--trailerдо следующего вхождения--if-existsили--no-if-exists. Возможные действия:addIfDifferent,addIfDifferentNeighbor,add,replaceиdoNothing.Используйте
--no-if-exists, чтобы отменить действие всех предыдущих параметров--if-exists, в результате чего соответствующие переменные конфигурации больше не будут переопределяться. -
--if-missing=<action> -
--no-if-missing -
Указать, какое действие выполнять, если во входных данных нет других строк-трейлеров с таким же
<key>. Значение, заданное с помощью--if-missing, переопределяетtrailer.ifMissingи все применимые переменные конфигурацииtrailer.<key-alias>.ifMissingи применяется ко всем параметрам--trailerдо следующего вхождения--if-missingили--no-if-missing. Возможные действия:doNothingилиadd.Используйте
--no-if-missing, чтобы отменить действие всех предыдущих параметров--if-missing, в результате чего соответствующие переменные конфигурации больше не будут переопределяться. -
--only-trailers -
--no-only-trailers -
Выводить только строки-трейлеры, без остальных частей входных данных. По умолчанию используется
--no-only-trailers. -
--only-input -
--no-only-input -
Выводить только строки-трейлеры, имеющиеся во входных данных; не добавлять строки из командной строки или в результате применения переменных конфигурации
trailer.<key-alias>. По умолчанию используется--no-only-input. -
--unfold -
--no-unfold -
Если значение строки-трейлера занимает несколько строк (то есть оно «свернуто»), преобразовать его в одну строку. По умолчанию используется
--no-unfold. -
--parse -
Удобный псевдоним для
--only-trailers--only-input--unfold. Он позволяет проще вывести только строки-трейлеры из входных данных без изменения под влиянием параметров командной строки или переменных конфигурации, а также получить пригодный для машинной обработки вывод с помощью--unfold.У этого псевдонима нет псевдонима для отмены его действия.
-
--divider -
--no-divider -
Считать
---концом сообщения коммита. Это значение используется по умолчанию. Используйте--no-divider, если известно, что входные данные содержат только само сообщение коммита (а не электронное письмо или вывод git-format-patch[1]).
Переменные конфигурации
Весь текст ниже этой строки в данном разделе выборочно включен из документации git-config[1]. Содержимое совпадает с приведенным там:
-
trailer.separators -
Этот параметр определяет символы, распознаваемые как разделители строк-трейлеров. По умолчанию разделителем строки-трейлера считается только
:, однако=всегда принимается в командной строке для совместимости с другими командами git.Первый символ, указанный этим параметром, будет символом разделителя по умолчанию, если для этой строки-трейлера в конфигурации не задан другой разделитель.
Например, если значение этого параметра —
%=$, строками-трейлерами будут считаться только строки формата<key><sep><value>, в которых<sep>содержит%,=или$, а после него следуют пробелы. Символ%будет использоваться как разделитель по умолчанию, поэтому строки-трейлеры будут выглядеть так: <key>%<value> (между ключом и значением будет один знак процента и один пробел). -
trailer.where -
Этот параметр определяет, куда будет добавлена новая строка-трейлер.
Возможные значения:
end(значение по умолчанию),start,afterилиbefore.Если указано
end, каждая новая строка-трейлер будет добавлена в конец имеющихся строк-трейлеров.Если указано
start, каждая новая строка-трейлер будет добавлена в начало, а не в конец имеющихся строк-трейлеров.Если указано
after, каждая новая строка-трейлер будет добавлена сразу после последней строки-трейлера с таким же<key>.Если указано
before, каждая новая строка-трейлер будет добавлена сразу перед первой строкой-трейлером с таким же<key>. -
trailer.ifexists -
Этот параметр позволяет выбрать действие, которое будет выполняться, если во входных данных уже есть хотя бы одна строка-трейлер с таким же
<key>.Допустимые значения этого параметра:
addIfDifferentNeighbor(значение по умолчанию),addIfDifferent,add,replaceилиdoNothing.При значении
addIfDifferentNeighborновая строка-трейлер будет добавлена, только если выше или ниже строки, куда она будет помещена, нет строки-трейлера с такой же парой (<key>,<value>).При значении
addIfDifferentновая строка-трейлер будет добавлена, только если во входных данных еще нет строки-трейлера с такой же парой (<key>,<value>).При значении
addновая строка-трейлер будет добавлена, даже если во входных данных уже есть строки-трейлеры с такой же парой (<key>,<value>).При значении
replaceимеющаяся строка-трейлер с таким же<key>будет удалена, а новая строка-трейлер добавлена. Удаляется ближайшая (с таким же<key>) к месту добавления новой строки-трейлер.При значении
doNothingничего не произойдет: новая строка-трейлер не будет добавлена, если во входных данных уже есть строка-трейлер с таким же<key>. -
trailer.ifmissing -
Этот параметр позволяет выбрать действие, которое будет выполняться, если во входных данных еще нет строки-трейлера с таким же
<key>.Допустимые значения этого параметра:
add(значение по умолчанию) иdoNothing.При значении
addбудет добавлена новая строка-трейлер.При значении
doNothingничего не произойдет. -
trailer.<key-alias>.key -
Задает
<key-alias>для<key>.<key-alias>должен быть префиксом (регистр не имеет значения)<key>. Например, вgitconfigtrailer.ack.key"Acked-by"Acked-by— это<key>, аack— это<key-alias>. Эта настройка позволяет использовать в командной строке сокращенный вызов--trailer"ack:..."с псевдонимом «ack» <key-alias> вместо более длинного--trailer"Acked-by:...".В конце
<key>может находиться разделитель, за которым могут следовать пробелы. По умолчанию допустим только разделитель:, но его можно изменить с помощью переменной конфигурацииtrailer.separators.Если в ключе есть разделитель, он переопределяет разделитель по умолчанию при добавлении строки-трейлера.
-
trailer.<key-alias>.where -
Этот параметр принимает те же значения, что и переменная конфигурации
trailer.where, и переопределяет заданное ею значение для строк-трейлеров с указанным<key-alias>. -
trailer.<key-alias>.ifexists -
Этот параметр принимает те же значения, что и переменная конфигурации
trailer.ifexists, и переопределяет заданное ею значение для строк-трейлеров с указанным<key-alias>. -
trailer.<key-alias>.ifmissing -
Этот параметр принимает те же значения, что и переменная конфигурации
trailer.ifmissing, и переопределяет заданное ею значение для строк-трейлеров с указанным<key-alias>. -
trailer.<key-alias>.command -
Устарел; вместо него используйте
trailer.<key-alias>.cmd. Этот параметр работает так же, какtrailer.<key-alias>.cmd, за исключением того, что указанной команде не передается аргумент. Вместо этого первое вхождение подстроки$ARGзаменяется на<value>, которое было бы передано в качестве аргумента.Обратите внимание, что
$ARGв команде пользователя заменяется только один раз, а исходный способ замены$ARGнебезопасен.Если для одного и того же
<key-alias>заданы оба параметра —trailer.<key-alias>.cmdиtrailer.<key-alias>.command, — используетсяtrailer.<key-alias>.cmd, аtrailer.<key-alias>.commandигнорируется. -
trailer.<key-alias>.cmd -
Этот параметр позволяет указать команду оболочки, которая будет вызвана один раз для автоматического добавления строки-трейлера с указанным
<key-alias>, а затем будет вызываться каждый раз, когда для изменения<value>создаваемой этим параметром строки-трейлера задается аргумент--trailer<key-alias>=<value>.При первом вызове указанной команды для добавления строки-трейлера с заданным
<key-alias>она работает так, как если бы в начале git-interpret-trailers[1] был добавлен специальный аргумент--trailer<key-alias>=<value>, где<value>— это стандартный вывод команды без начальных и конечных пробельных символов.Если в командной строке также переданы аргументы
--trailer<key-alias>=<value>, команда вызывается повторно для каждого из этих аргументов с тем же<key-alias>. Часть<value>этих аргументов, если она есть, передается команде в качестве первого аргумента. Таким образом, команда может сформировать<value>, вычисленное на основе<value>, переданного в аргументе--trailer<key-alias>=<value>.
Примеры
-
Настройте строку-трейлер
signс ключомSigned-off-by, а затем добавьте две такие строки-трейлеры в файл сообщения коммита:$ git config trailer.sign.key "Signed-off-by" $ cat msg.txt subject body text $ git interpret-trailers --trailer 'sign: Alice <alice@example.com>' --trailer 'sign: Bob <bob@example.com>' <msg.txt subject body text Signed-off-by: Alice <alice@example.com> Signed-off-by: Bob <bob@example.com>
-
Используйте параметр
--in-place, чтобы отредактировать файл сообщения коммита на месте:$ cat msg.txt subject body text Signed-off-by: Bob <bob@example.com> $ git interpret-trailers --trailer 'Acked-by: Alice <alice@example.com>' --in-place msg.txt $ cat msg.txt subject body text Signed-off-by: Bob <bob@example.com> Acked-by: Alice <alice@example.com>
-
Извлеките последний коммит в виде патча и добавьте к нему строки-трейлеры
CcиReviewed-by:$ git format-patch -1 0001-foo.patch $ git interpret-trailers --trailer 'Cc: Alice <alice@example.com>' --trailer 'Reviewed-by: Bob <bob@example.com>' 0001-foo.patch >0001-bar.patch
-
Настройте строку-трейлер
signс командой для автоматического добавления «Signed-off-by:» с информацией об авторе, только если строки «Signed-off-by:» еще нет, и посмотрите, как это работает:$ cat msg1.txt subject body text $ git config trailer.sign.key "Signed-off-by: " $ git config trailer.sign.ifmissing add $ git config trailer.sign.ifexists doNothing $ git config trailer.sign.cmd 'echo "$(git config user.name) <$(git config user.email)>"' $ git interpret-trailers --trailer sign <msg1.txt subject body text Signed-off-by: Bob <bob@example.com> $ cat msg2.txt subject body text Signed-off-by: Alice <alice@example.com> $ git interpret-trailers --trailer sign <msg2.txt subject body text Signed-off-by: Alice <alice@example.com>
-
Настройте строку-трейлер
fixс ключом, содержащим символ#без пробела после него, и посмотрите, как это работает:$ git config trailer.separators ":#" $ git config trailer.fix.key "Fix #" $ echo "subject" | git interpret-trailers --trailer fix=42 subject Fix #42
-
Настройте строку-трейлер
helpс командой, использующей скриптglog-find-author, который ищет в журнале git репозитория указанную идентификационную информацию автора, и посмотрите, как это работает:$ cat ~/bin/glog-find-author #!/bin/sh test -n "$1" && git log --author="$1" --pretty="%an <%ae>" -1 || true $ cat msg.txt subject body text $ git config trailer.help.key "Helped-by: " $ git config trailer.help.ifExists "addIfDifferentNeighbor" $ git config trailer.help.cmd "~/bin/glog-find-author" $ git interpret-trailers --trailer="help:Junio" --trailer="help:Couder" <msg.txt subject body text Helped-by: Junio C Hamano <gitster@pobox.com> Helped-by: Christian Couder <christian.couder@gmail.com>
-
Настройте строку-трейлер
refс командой, использующей скриптglog-grepдля поиска в журнале git репозитория последнего подходящего коммита, и посмотрите, как это работает:$ cat ~/bin/glog-grep #!/bin/sh test -n "$1" && git log --grep "$1" --pretty=reference -1 || true $ cat msg.txt subject body text $ git config trailer.ref.key "Reference-to: " $ git config trailer.ref.ifExists "replace" $ git config trailer.ref.cmd "~/bin/glog-grep" $ git interpret-trailers --trailer="ref:Add copyright notices." <msg.txt subject body text Reference-to: 8bc9a0c769 (Add copyright notices., 2005-04-07)
-
Настройте строку-трейлер
seeс командой для отображения темы связанного коммита и посмотрите, как это работает:$ cat msg.txt subject body text see: HEAD~2 $ cat ~/bin/glog-ref #!/bin/sh git log -1 --oneline --format="%h (%s)" --abbrev-commit --abbrev=14 $ git config trailer.see.key "See-also: " $ git config trailer.see.ifExists "replace" $ git config trailer.see.ifMissing "doNothing" $ git config trailer.see.cmd "glog-ref" $ git interpret-trailers --trailer=see <msg.txt subject body text See-also: fe3187489d69c4 (subject of related commit)
-
Настройте шаблон коммита с несколькими строками-трейлерами с пустыми значениями (используя sed для отображения и сохранения конечных пробелов в строках-трейлерах), затем настройте перехватчик commit-msg, который использует git-interpret-trailers(1) для удаления строк-трейлеров с пустыми значениями и добавления строки-трейлера
git-version:$ cat temp.txt ***subject*** ***message*** Fixes: Z Cc: Z Reviewed-by: Z Signed-off-by: Z $ sed -e 's/ Z$/ /' temp.txt > commit_template.txt $ git config commit.template commit_template.txt $ cat .git/hooks/commit-msg #!/bin/sh git interpret-trailers --trim-empty --trailer "git-version: \$(git describe)" "\$1" > "\$1.new" mv "\$1.new" "\$1" $ chmod +x .git/hooks/commit-msg
См. также
interpret-trailers
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-interpret-trailers