日本語 ▾ トピック ▾ 最新バージョン ▾ git-interpret-trailers は 2.49.0 で最終更新されました

名前

git-interpret-trailers - コミットメッセージに構造化された情報を追加または解析する

概要

git interpret-trailers [--in-place] [--trim-empty]
			[(--trailer (<key>|<key-alias>)[(=|:)<value>])…​]
			[--parse] [<file>…​]

説明

コミットメッセージの自由形式の部分の末尾に、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" で始まる最後の2行がトレーラーです。

このコマンドは、<file> 引数が指定されていない場合は <file> 引数または標準入力からコミットメッセージを読み取ります。--parse が指定されている場合、出力は、コマンドラインオプションや設定変数に影響されることなく、入力から解析されたトレーラーで構成されます。

それ以外の場合、このコマンドは、trailer.* 設定変数 (新しいトレーラーを追加したり、位置を変更したりする可能性がある) と、設定変数を上書きする可能性のあるコマンドライン引数 (--trailer=... などで新しいトレーラーを追加できる) を各入力ファイルに適用します。結果は標準出力に出力されます。

このコマンドは、単なるコミットメッセージよりも詳細な git-format-patch[1] の出力に対しても動作できます。つまり、このような出力にはコミットメッセージ (上記のとおり)、"---" 区切り行、パッチ部分が含まれます。これらの入力の場合、区切り文字とパッチ部分は、--no-divider が指定されていない限り、このコマンドによって変更されず、出力にそのまま出力されます。

いくつかの設定変数は、--trailer 引数が各入力に適用される方法と、入力内の既存のトレーラーが変更される方法を制御します。また、いくつかのトレーラーを自動的に追加することも可能です。

デフォルトでは、--trailer を使用して与えられた _<key>=<value>_ または _<key>:<value>_ 引数は、最後のトレーラーが異なる (<key>, <value>) ペアを持つ場合にのみ (または既存のトレーラーがない場合にのみ) 既存のトレーラーの後に追記されます。<key> と <value> の部分は、先頭と末尾の空白文字が削除されるようにトリムされ、結果としてトリムされた <key> と <value> は、出力で次のように表示されます。

key: value

これは、トリムされた <key> と <value> が : (コロン1つとスペース1つ) で区切られることを意味します。

便宜上、コマンドラインで --trailer の入力を短縮するために <key-alias> を設定できます。これは、_trailer.<key-alias>.key_ 設定変数を使用して設定できます。<keyAlias> は、大文字小文字を区別しない場合でも、完全な <key> 文字列のプレフィックスである必要があります。たとえば、設定に次の行がある場合、

trailer.sign.key "Signed-off-by: "

--trailer="Signed-off-by: foo" の代わりに、コマンドラインで --trailer="sign: foo" と指定するだけで済みます。

デフォルトでは、新しいトレーラーは既存のすべてのトレーラーの最後に表示されます。既存のトレーラーがない場合、新しいトレーラーは入力の最後に表示されます。まだない場合、新しいトレーラーの前に空白行が追加されます。

既存のトレーラーは、(i) すべてがトレーラーであるか、(ii) 少なくとも1つのGit生成またはユーザー設定されたトレーラーを含み、かつ少なくとも25%がトレーラーである、1行以上の行のグループを探すことで入力から抽出されます。このグループは、1つ以上の空の (または空白のみの) 行に先行されている必要があります。このグループは、入力の末尾にあるか、または _---_ (スペースまたは行末が続く) で始まる行の前の最後の非空白行である必要があります。

トレーラーを読み取る際、<key> の前または内部に空白文字は存在できませんが、<key> とセパレーターの間には任意の数の通常のスペースおよびタブ文字が許可されます。<value> の前、内部、または後に空白文字が存在できます。<value> は、RFC 822 の「折り返し」のように、各後続の行が少なくとも1つの空白文字で始まる複数の行に分割される場合があります。例:

key: This is a very long value, with spaces and
  newlines in it.

トレーラーは、RFC 822 ヘッダーの多くの規則に従わない (また、従うことを意図していない) ことに注意してください。たとえば、エンコード規則には従いません。

オプション

--in-place

ファイルをその場で編集します。

--trim-empty

いずれかのトレーラーの <value> 部分に空白文字のみが含まれる場合、トレーラー全体が出力から削除されます。これは既存のトレーラーと新しいトレーラーの両方に適用されます。

--trailer <key>[(=|:)<value>]

入力にトレーラーとして適用されるべき (<key>, <value>) ペアを指定します。このコマンドの説明を参照してください。

--where <placement>
--no-where

すべての新しいトレーラーが追加される場所を指定します。 _--where_ で提供される設定は、trailer.where および適用可能な trailer.<keyAlias>.where 設定変数を上書きし、次の _--where_ または _--no-where_ が現れるまで、すべての _--trailer_ オプションに適用されます。 _--no-where_ に遭遇すると、以前の _--where_ の効果がクリアされ、関連する設定変数が上書きされなくなります。可能な配置は afterbeforeend、または start です。

--if-exists <action>
--no-if-exists

入力に同じ <key> を持つトレーラーがすでに少なくとも1つ存在する場合に実行されるアクションを指定します。 _--if-exists_ で提供される設定は、trailer.ifExists および適用可能な trailer.<keyAlias>.ifExists 設定変数を上書きし、次の _--if-exists_ または _--no-if-exists_ が現れるまで、すべての _--trailer_ オプションに適用されます。'--no-if-exists' に遭遇すると、以前の '--if-exists' の効果がクリアされ、関連する設定変数が上書きされなくなります。可能なアクションは addIfDifferentaddIfDifferentNeighboraddreplace、および doNothing です。

--if-missing <action>
--no-if-missing

入力に同じ <key> を持つ他のトレーラーがない場合に実行されるアクションを指定します。 _--if-missing_ で提供される設定は、trailer.ifMissing および適用可能な trailer.<keyAlias>.ifMissing 設定変数を上書きし、次の _--if-missing_ または _--no-if-missing_ が現れるまで、すべての _--trailer_ オプションに適用されます。'--no-if-missing' に遭遇すると、以前の '--if-missing' の効果がクリアされ、関連する設定変数が上書きされなくなります。可能なアクションは doNothing または add です。

--only-trailers

入力の他の部分ではなく、トレーラーのみを出力します。

--only-input

入力に存在するトレーラーのみを出力します。コマンドラインから、または trailer.* 設定変数を適用して追加することはありません。

--unfold

トレーラーが複数行にわたる値 (「折り畳まれた」とも呼ばれる) を持つ場合、値を単一行に再フォーマットします。

--parse

--only-trailers --only-input --unfold の便利なエイリアスです。これにより、コマンドラインオプションや設定変数に影響されることなく、入力からのトレーラーのみを表示し、さらに --unfold を使用して出力をマシンフレンドリーにすることができます。

--no-divider

--- をコミットメッセージの終わりとして扱いません。入力にコミットメッセージ自体のみが含まれる場合 (電子メールや git format-patch の出力ではない場合) に使用します。

設定変数

このセクションのこの行より下のすべての内容は、git-config[1] ドキュメントから選択的に含まれています。内容はそちらで見られるものと同じです。

trailer.separators

このオプションは、どの文字がトレーラーセパレーターとして認識されるかを指定します。デフォルトでは、_:_ のみがトレーラーセパレーターとして認識されますが、他の git コマンドとの互換性のために _=_ はコマンドラインで常に受け入れられます。

このオプションで与えられた最初の文字は、このトレーラーの設定で別のセパレーターが指定されていない場合のデフォルト文字になります。

たとえば、このオプションの値が "%=$" の場合、<key><sep><value> の形式を使用し、<sep> に _%_、 _=_、または _$_ が含まれ、その後スペースが続く行のみがトレーラーと見なされます。そして、 _%_ がデフォルトのセパレーターとして使用されるため、デフォルトではトレーラーは次のように表示されます。_<key>% <value>_ (キーと値の間にパーセント記号1つとスペース1つが表示されます)。

trailer.where

このオプションは、新しいトレーラーが追加される場所を指定します。

これは end (デフォルト)、 startafter、または before にすることができます。

end の場合、新しいトレーラーはそれぞれ既存のトレーラーの最後に表示されます。

start の場合、新しいトレーラーはそれぞれ既存のトレーラーの最後にではなく、先頭に表示されます。

after の場合、新しいトレーラーはそれぞれ同じ <key> を持つ最後のトレーラーの直後に表示されます。

before の場合、新しいトレーラーはそれぞれ同じ <key> を持つ最初のトレーラーの直前に表示されます。

trailer.ifexists

このオプションを使用すると、入力に同じ <key> を持つトレーラーがすでに少なくとも1つ存在する場合に実行されるアクションを選択できます。

このオプションの有効な値は、addIfDifferentNeighbor (これがデフォルト)、addIfDifferentaddreplace、または doNothing です。

addIfDifferentNeighbor の場合、新しいトレーラーは、新しいトレーラーが追加される行の上または下に同じ (<key>, <value>) ペアを持つトレーラーがない場合にのみ追加されます。

addIfDifferent の場合、新しいトレーラーは、同じ (<key>, <value>) ペアを持つトレーラーが入力にすでに存在しない場合にのみ追加されます。

add の場合、同じ (<key>, <value>) ペアを持つトレーラーが入力にすでにいくつか存在する場合でも、新しいトレーラーが追加されます。

replace の場合、同じ <key> を持つ既存のトレーラーは削除され、新しいトレーラーが追加されます。削除されるトレーラーは、新しいトレーラーが追加される場所に最も近いもの (同じ <key> を持つ) になります。

doNothing の場合、何も行われません。つまり、入力に同じ <key> を持つトレーラーがすでに存在する場合、新しいトレーラーは追加されません。

trailer.ifmissing

このオプションを使用すると、入力に同じ <key> を持つトレーラーがまだない場合に実行されるアクションを選択できます。

このオプションの有効な値は、add (これがデフォルト) および doNothing です。

add の場合、新しいトレーラーが追加されます。

doNothing の場合、何も行われません。

trailer.<keyAlias>.key

<key> の <keyAlias> を定義します。<keyAlias> は、<key> のプレフィックスである必要があります (大文字小文字は関係ありません)。たとえば、git config trailer.ack.key "Acked-by" では、"Acked-by" が <key> で、"ack" が <keyAlias> です。この設定により、長い --trailer "Acked-by:..." の代わりに、"ack" <keyAlias> を使用してコマンドラインで短い --trailer "ack:..." を呼び出すことができます。

<key> の末尾には、区切り文字とその後にいくつかのスペース文字を付けることができます。デフォルトでは、唯一有効な区切り文字は _:_ ですが、これは trailer.separators 設定変数を使用して変更できます。

キーに区切り文字がある場合、トレーラーを追加する際にデフォルトの区切り文字を上書きします。

trailer.<keyAlias>.where

このオプションは、_trailer.where_ 設定変数と同じ値を取り、指定された <keyAlias> を持つトレーラーに対してそのオプションで指定されたものを上書きします。

trailer.<keyAlias>.ifexists

このオプションは、_trailer.ifexists_ 設定変数と同じ値を取り、指定された <keyAlias> を持つトレーラーに対してそのオプションで指定されたものを上書きします。

trailer.<keyAlias>.ifmissing

このオプションは、_trailer.ifmissing_ 設定変数と同じ値を取り、指定された <keyAlias> を持つトレーラーに対してそのオプションで指定されたものを上書きします。

trailer.<keyAlias>.command

_trailer.<keyAlias>.cmd_ の推奨により非推奨になりました。このオプションは _trailer.<keyAlias>.cmd_ と同じように動作しますが、指定されたコマンドに引数を渡しません。代わりに、部分文字列 $ARG の最初の出現は、引数として渡される <value> に置き換えられます。

ユーザーのコマンド内の $ARG は一度だけ置き換えられ、 $ARG を置き換える元の方法は安全ではないことに注意してください。

同じ <keyAlias> に対して _trailer.<keyAlias>.cmd_ と _trailer.<keyAlias>.command_ の両方が指定されている場合、 _trailer.<keyAlias>.cmd_ が使用され、 _trailer.<keyAlias>.command_ は無視されます。

trailer.<keyAlias>.cmd

このオプションは、指定された <keyAlias> を持つトレーラーを自動的に追加するために一度呼び出され、その後、このオプションが生成するトレーラーの <value> を変更するために _--trailer <keyAlias>=<value>_ 引数が指定されるたびに呼び出されるシェルコマンドを指定するために使用できます。

指定されたコマンドが、指定された <keyAlias> を持つトレーラーを追加するために最初に呼び出された場合、動作は、特別な _--trailer <keyAlias>=<value>_ 引数が「git interpret-trailers」コマンドの先頭に追加されたかのようになります。ここで <value> は、コマンドの標準出力から先頭と末尾の空白文字がトリムされたものと見なされます。

いくつかの _--trailer <keyAlias>=<value>_ 引数もコマンドラインで渡された場合、コマンドはこれらの引数ごとに同じ <keyAlias> で再度呼び出されます。そして、これらの引数の <value> 部分 (もしあれば) は、コマンドの最初の引数として渡されます。このようにして、コマンドは _--trailer <keyAlias>=<value>_ 引数で渡された <value> から計算された <value> を生成できます。

  • _sign_ トレーラーを _Signed-off-by_ キーで設定し、これらのトレーラーを2つコミットメッセージファイルに追加します。

    $ 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_ トレーラーを、git リポジトリの git ログから指定された作者 ID を検索するスクリプト glog-find-author を使用する cmd で設定し、その動作を示します。

    $ 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_ トレーラーを、git リポジトリの git ログから最新の関連コミットを grep するスクリプト glog-grep を使用する cmd で設定し、その動作を示します。

    $ 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 を使用してトレーラーの末尾のスペースを表示して保持します)、その後、空の値を持つトレーラーを削除し、_git-version_ トレーラーを追加するために _git interpret-trailers_ を使用するコミットメッセージフックを設定します。

    $ 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

GIT

git[1]スイートの一部

scroll-to-top