简体中文 ▾ 主题 ▾ 最新版本 ▾ 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 选项可以出现任意次数,顺序不限。提交日志消息将按照选项给出的顺序组合。

一个提交对象可以有任意数量的父提交。只有一个父提交时,它是普通提交。有多个父提交时,该提交是多个历史分支的合并。初始(根)提交没有父提交。

树对象代表工作目录的特定目录状态,而提交对象则代表“时间”上的该状态,并解释如何到达那里。

通常,提交会标识一个新的“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

  • 作者姓名、电子邮件和日期

  • 提交者姓名、电子邮件和提交时间。

提交注释从标准输入读取。如果通过“<”重定向未提供变更日志条目,git commit-tree 将简单地等待输入,直到按下 Ctrl+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

注意
此外,日期部分支持以下格式:YYYY.MM.DDMM/DD/YYYYDD.MM.YYYY

讨论

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

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

  • 路径名以 UTF-8 规范形式 C 进行编码。这适用于 tree 对象、索引文件、引用名称,以及命令行参数、环境变量和配置文件(.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

    使用上述设置创建的提交对象会将其 i18n.commitEncoding 的值记录在它们的 encoding 头中。这是为了帮助以后查看它们的人。缺少此头表示提交日志消息是 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

Git[1] 套件的一部分