Skip to content

git-commit-tree

命令名称 - 创建新的提交对象

概要

bash
[verse]
'git commit-tree' <tree> [(-p <parent>)...]
'git commit-tree' [(-p <parent>)...] [-S[<keyid>]] [(-m <message>)...]
		  [(-F <file>)...] <tree>

描述

这通常不是最终用户想要直接运行的。请参阅 git-commit(1)

基于提供的树对象创建新的提交对象,并在 stdout 上发出新的提交对象 id。除非给出 -m-F 选项,否则从标准输入读取日志消息。

-m-F 选项可以以任何顺序给出任意多次。提交日志消息将按选项给出的顺序组合。

提交对象可以有任意多个父级。只有一个父级时,它是普通提交。有多个父级使提交成为多行历史记录之间的合并。初始(根)提交没有父级。

虽然树表示工作目录的特定目录状态,但提交表示该状态在"时间"中的位置,并解释了如何到达那里。

通常,提交将标识一个新的"HEAD"状态,虽然 Git 不关心您在哪里保存关于该状态的说明,但实际上我们倾向于将结果写入 .git/HEAD 指向的文件,以便我们始终可以看到最后提交的状态是什么。

选项

  • <tree> - 现有的树对象。

  • -p <parent> - 每个 -p 表示一个父提交对象的 id。

  • -m <message> - 提交日志消息中的一个段落。可以多次给出,每个 <message> 成为自己的段落。

  • -F <file> - 从给定文件读取提交日志消息。使用 - 从标准输入读取。可以多次给出,每个文件的内容成为自己的段落。

  • -S[<keyid>] / --gpg-sign[=<keyid>] / --no-gpg-sign - GPG 签名提交。keyid 参数是可选的,默认为提交者身份;如果指定,必须紧贴选项,不留空格。--no-gpg-sign 可用于取消命令行上先前给出的 --gpg-sign 选项。

提交信息

提交封装了:

  • 所有父对象 id
  • 作者姓名、电子邮件和日期
  • 提交者姓名、电子邮件和提交时间。

提交注释从 stdin 读取。如果未通过 "<" 重定向提供更改日志条目,git commit-tree 将等待输入一个并以 ^D 终止。

日期格式

GIT_AUTHOR_DATEGIT_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

    TIP

    此外,日期部分还接受以下格式:

    YYYY.MM.DDMM/DD/YYYYDD.MM.YYYY

讨论

Git 在某种程度上是字符编码无关的。

  • blob 对象的内容是未解释的字节序列。在核心级别没有编码转换。

  • 路径名以 UTF-8 规范化形式 C 编码。这适用于树对象、索引文件、引用名称以及命令行参数、环境变量和配置文件(.git/config(参见 git-config(1))、gitignore(5)gitattributes(5)gitmodules(5))中的路径名。

    请注意,Git 在核心级别仅将路径名视为非 NUL 字节序列,不存在路径名编码转换(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 Porcelain 都设计为不强制项目使用 UTF-8。如果特定项目的所有参与者发现使用传统编码更方便,Git 不会禁止。但是,有几点需要牢记。

  1. git commitgit commit-tree 在给定的提交日志消息看起来不像有效的 UTF-8 字符串时会发出警告,除非您明确说明您的项目使用传统编码。说明方式是在 .git/config 文件中设置 i18n.commitEncoding,如下所示:

    [i18n]
    commitEncoding = ISO-8859-1

    使用上述设置创建的提交对象在其 encoding 头中记录 i18n.commitValues 的值。这是为了帮助以后查看它们的其他人。缺少此头意味着提交日志消息以 UTF-8 编码。

  2. git loggit showgit blame 等会查看提交对象的 encoding 头,并尝试将日志消息重新编码为 UTF-8,除非另有说明。您可以在 .git/config 文件中使用 i18n.logOutputEncoding 指定期望的输出编码,如下所示:

    [i18n]
    logOutputEncoding = ISO-8859-1

    如果没有此配置变量,则使用 i18n.commitEncoding 的值。

请注意,我们故意选择不在提交时重新编码提交日志消息以在提交对象级别强制 UTF-8,因为重新编码为 UTF-8 不一定是可逆操作。

文件

/etc/mailname

另请参阅

git-write-tree(1)git-commit(1)

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布