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

名前

git-commit-tree - 新しいコミットオブジェクトを作成

概要

git commit-tree <tree> [(-p <parent>)…​]
git commit-tree [(-p <parent>)…​] [-S[<keyid>]] [(-m <message>)…​]
		  [(-F <file>)…​] <tree>

説明

これは通常、エンドユーザーが直接実行するものではありません。git-commit[1]を参照してください。

指定されたツリーオブジェクトに基づいて新しいコミットオブジェクトを作成し、新しいコミットオブジェクトIDを標準出力に出力します。ログメッセージは、`-m`または`-F`オプションが指定されていない限り、標準入力から読み取られます。

`-m`および`-F`オプションは、任意の順序で何度でも指定できます。コミットログメッセージは、オプションが与えられた順序で構成されます。

コミットオブジェクトは任意の数の親を持つことができます。親が1つだけの場合、それは通常のコミットです。親が複数ある場合、そのコミットは複数の履歴行のマージになります。初期(ルート)コミットには親がありません。

ツリーがワーキングディレクトリの特定のディレクトリ状態を表すのに対し、コミットはその状態を「時間」で表し、そこに到達する方法を説明します。

通常、コミットは新しい「HEAD」状態を識別し、Gitはその状態に関するメモをどこに保存するかを気にしませんが、実際には、最後にコミットされた状態を常に確認できるように、結果を`.git/HEAD`が指すファイルに書き込む傾向があります。

オプション

<ツリー>

既存のツリーオブジェクト。

-p <親>

各`-p`は親コミットオブジェクトのIDを示します。

-m <メッセージ>

コミットログメッセージ内の段落。これは複数回指定でき、各<メッセージ>がそれ自身の段落になります。

-F <ファイル>

指定されたファイルからコミットログメッセージを読み取ります。標準入力から読み取るには`-`を使用します。これは複数回指定でき、各ファイルの内容がそれ自身の段落になります。

-S[<keyid>]
--gpg-sign[=<keyid>]
--no-gpg-sign

GPG署名コミット。`keyid`引数はオプションであり、デフォルトはコミッターのIDです。指定する場合、スペースなしでオプションに付加する必要があります。`--no-gpg-sign`は、コマンドラインで以前に指定された`--gpg-sign`オプションを取り消すのに役立ちます。

コミット情報

コミットは以下をカプセル化します

  • すべての親オブジェクトID

  • 作者名、メールアドレス、日付

  • コミッター名、メールアドレス、コミット時刻。

コミットコメントは標準入力から読み取られます。`<`リダイレクトによって変更ログエントリが提供されない場合、*git commit-tree*は入力され、^Dで終了するのを待つだけです。

日付フォーマット

`GIT_AUTHOR_DATE`および`GIT_COMMITTER_DATE`環境変数は、以下の日付フォーマットをサポートします

Git内部フォーマット

これは`<unix-timestamp> <time-zone-offset>`です。`<unix-timestamp>`はUNIXエポックからの秒数です。`<time-zone-offset>`はUTCからの正または負のオフセットです。例えば、CET(UTCより1時間進んでいる)は`+0100`です。

RFC 2822

RFC 2822で記述されている標準の日付フォーマット。例: `Thu, 07 Apr 2005 22:13:13 +0200`。

ISO 8601

ISO 8601標準で指定された時刻と日付。例: `2005-04-07T22:13:13`。パーサーは`T`文字の代わりにスペースも受け入れます。秒の小数部分は無視されます。例: `2005-04-07T22:13:13.019`は`2005-04-07T22:13:13`として扱われます。

注記
さらに、日付部分は以下のフォーマットで受け入れられます: `YYYY.MM.DD`、`MM/DD/YYYY`、`DD.MM.YYYY`。

議論

Gitは、ある程度、文字エンコーディングに依存しません。

  • BLOBオブジェクトの内容は、解釈されないバイトシーケンスです。コアレベルでのエンコーディング変換はありません。

  • パス名はUTF-8正規化形式Cでエンコードされます。これは、ツリーオブジェクト、インデックスファイル、参照名、およびコマンドライン引数、環境変数、設定ファイル(`.git/config` (詳細はgit-config[1]を参照)、gitignore[5]gitattributes[5]gitmodules[5])内のパス名に適用されます。

    Gitはコアレベルではパス名を単に非NULLバイトのシーケンスとして扱います(MacとWindowsを除くパス名エンコーディング変換はありません)。したがって、レガシー拡張ASCIIエンコーディングを使用するプラットフォームやファイルシステムでも、非ASCIIパス名を使用してもほとんどの場合機能します。ただし、そのようなシステムで作成されたリポジトリは、UTF-8ベースのシステム(例: Linux、Mac、Windows)では正しく機能せず、その逆も同様です。さらに、多くのGitベースのツールは、パス名がUTF-8であると単純に仮定しており、他のエンコーディングを正しく表示できません。

  • コミットログメッセージは通常UTF-8でエンコードされますが、他の拡張ASCIIエンコーディングもサポートされています。これにはISO-8859-x、CP125xなどが含まれますが、UTF-16/32、EBCDIC、CJKマルチバイトエンコーディング(GBK、Shift-JIS、Big5、EUC-x、CP9xxなど)は*含まれません*。

コミットログメッセージはUTF-8でエンコードすることを推奨しますが、GitのコアとGit PorcelainはいずれもプロジェクトにUTF-8を強制しないように設計されています。特定のプロジェクトのすべての参加者がレガシーエンコーディングを使用する方が便利だと考える場合、Gitはそれを禁止しません。ただし、いくつか留意すべき点があります。

  1. `git commit`および`git commit-tree`は、指定されたコミットログメッセージが有効なUTF-8文字列に見えない場合、プロジェクトがレガシーエンコーディングを使用していると明示的に指定しない限り、警告を発します。これを指定する方法は、`.git/config`ファイルに`i18n.commitEncoding`を設定することです。例:

    [i18n]
    	commitEncoding = ISO-8859-1

    上記の設定で作成されたコミットオブジェクトは、`encoding`ヘッダーに`i18n.commitEncoding`の値を記録します。これは、後でそれらを見る他の人々を助けるためです。このヘッダーがない場合、コミットログメッセージはUTF-8でエンコードされていることを意味します。

  2. `git log`、`git show`、`git blame`などのコマンドは、コミットオブジェクトの`encoding`ヘッダーを参照し、特に指定がない限り、ログメッセージをUTF-8に再エンコードしようとします。目的の出力エンコーディングは、`.git/config`ファイルに`i18n.logOutputEncoding`を設定することで指定できます。例:

    [i18n]
    	logOutputEncoding = ISO-8859-1

    この設定変数がない場合、代わりに`i18n.commitEncoding`の値が使用されます。

コミットオブジェクトレベルでUTF-8を強制するためにコミット時にログメッセージを再エンコードしないことを意図的に選択しました。これは、UTF-8への再エンコードが必ずしも可逆的な操作ではないためです。

ファイル

/etc/mailname

Git

git[1] スイートの一部

scroll-to-top