可以将其他数据放入git commit对象吗?

Joh*_*n O 7 git git-commit

在每个关于git对象的教程网站上,我将看到一个示例,其中git cat-file显示提交对象本身的样子,它通常类似于以下内容:

tree 552acd444696ccb1c3afe68a55ae8b20ece2b0e6
parent 6a1d380780a83ef5f49523777c5e8d801b7b9ba2
author John Doe <john.doe@exampler.com> 1326496982 -0600
committer John Doe <john.doe@exampler.com> 1326496982 -0600

Some commit message here.
Run Code Online (Sandbox Code Playgroud)

如果顶部有其他(单行)数据字段,这会混淆git工具吗?我假设即使没有,这些字段也不会出现在git log中.

如果它可以有其他字段,哪个git plumbing命令可以让你创建它?git commit-tree似乎不灵活.

A.H*_*.H. 8

将数据附加到提交的传统方法是“拖尾”:提交消息末尾的特殊格式行。(docu)Signed-of-by添加的行就是这样的预告片。git commit -s

Git 对这些有一些直接的支持:

  • git interpret-trailers (docu)是添加或解析这些行的助手
  • git log有一个格式占位符%(trailers[:options]) (docu)
  • git for-each-ref还有一个%(trailers)占位符(docu)

预告片有一些区别git notes

  • 预告片是提交消息的一部分,因此被散列覆盖。因此它们是不可变的。git notes是提交(或其他东西)的附加组件。
  • 拖车数据被克隆并推送到/从远程存储库。git notes不是默认的。
  • 拖车数据由git cherry-pickgit rebase和其他人移动。git notes... 有时。


and*_*otn 7

是的,您完全可以在其中放置更多名为 \xe2\x80\x9cgit commit extra headers\xe2\x80\x9d 的字段。它们\xe2\x80\x99ll 会出现git cat-file -p,但我认为使用标准 git 客户端首先将它们放入其中的唯一方法是编辑 git 源代码并重新编译。

\n\n

在 \n 中commit.h,\n有一个struct额外的标头,以及在提交时添加它们以及稍后读出它们的函数。

\n\n
struct commit_extra_header {\n        struct commit_extra_header *next;\n        char *key;\n        char *value;\n        size_t len;\n};\n\nint commit_tree_extended(const char *msg, size_t msg_len,\n                        const struct object_id *tree,\n                        struct commit_list *parents,\n                        struct object_id *ret, const char *author,\n                        const char *sign_commit,\n                        struct commit_extra_header *);\n\nstruct commit_extra_header *read_commit_extra_headers(struct commit *, const char **);\n
Run Code Online (Sandbox Code Playgroud)\n\n

commit.c包含 \xe2\x80\x98standard\xe2\x80\x99 标头字段的列表:

\n\n
static inline int standard_header_field(const char *field, size_t len)\n{\n        return ((len == 4 && !memcmp(field, "tree", 4)) ||\n                (len == 6 && !memcmp(field, "parent", 6)) ||\n                (len == 6 && !memcmp(field, "author", 6)) ||\n                (len == 9 && !memcmp(field, "committer", 9)) ||\n                (len == 8 && !memcmp(field, "encoding", 8)));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

其他所有内容都显示为 \xe2\x80\x98extra\xe2\x80\x99 标头。

\n\n

对源代码进行快速 grep 后,我发现当前唯一的用途是gpgsig用于在提交时包含 GPG 签名的标头。

\n\n

Kiln\nHarmonykilnhgusername ,\n现已停产,此处使用了和\n等字段kilnhgrawdescription

\n


Jer*_*y D 4

git notes将为任何提交添加任意注释。用法:git notes add <SHA>,例如git notes add HEAD。这将打开默认的文本编辑器并允许您输入注释。commit您还可以使用与使用, ie相同的方式从 CLI 指定消息git notes add -m "my message" HEAD

git log如果您在记笔记后运行 a ,您将看到:

commit 06ca03a20bb01203e2d6b8996e365f46cb6d59bd
Author: Example User <example@gmail.com>
Date:   Mon March 28 14:50:15 2016 -0700

    commit message

Notes:
    my message
Run Code Online (Sandbox Code Playgroud)

注释也可以被赋予名称空间。本文有完整的文档。