0

给定一个附有注释的提交,我可以在进行变基时将注释中的消息合并到提交的消息中吗?

这个问题的背景是我有一个通过 git-tfs 导入的大型存储库,其中有大量链接到单个提交的注释,当我清理存储库时,我想解决这些注释并将它们合并到相应的提交中消息。

4

1 回答 1

1

目前没有,没有。没有根本原因不能做到这一点,但对提交时的注释的支持仍然是一种原始的。Rebase 现在可以在复制提交时复制注释,但它不提供在使用 squash 时压缩注释的能力。

如果您想自己实现它,您应该从git notes实际工作方式开始,我将在这里简单描述一下。Git 在 ref name 下存储一个辅助提交refs/notes/commits。此提交包含一系列名称看起来很奇怪的文件,例如:

5d/01/301f2b865aa8dba1654d3f447ce9d21db0b5

例如。如果从文件名中去掉斜线,则结果是哈希 ID。该文件的内容是 commit 的注释5d01301f2b865aa8dba1654d3f447ce9d21db0b5

要更新笔记或添加新笔记,Git 将:

  • 提取注释提交到一个临时区域;
  • 创建或更新与所需提交对应的文件;
  • 使用生成的文件集进行新的提交,其父级是当前refs/notes/commits提交;和
  • 更新refs/notes/commits以存储新提交的哈希 ID。

实际上,这很像将refs/notes/commits提交检出为一个分支,只是你不能这样做,因为refs/notes/commits它不是一个分支名称。(此外,Git 在这里使用了一堆快捷方式来避免填充完整的工作树。)

因此,要将已压缩的提交 C1 和 C2 的注释合并到新的提交 C3 中,您将:

  • 记住三个哈希 ID;
  • 检查或以其他方式检查所需的注释提交——这可能是此时的一个,取决于你在哪里完成所有这些工作——找出xx/xx/xx/xx要使用的层数(这会有所不同:每当树在任何给定级别都“过于拥挤”;实际级别隐含在文件名中,但如果您从不拆分或连接名称,则不必担心这一点);
  • 找到与 C1 和 C2 对应的文件,并将它们与您喜欢的任何算法组合(可能是 union-merge);
  • 如果需要(如果您在上述 C3 的父级上工作)将 C3 的注释读入临时索引,或者确保在任何情况下在此临时索引中都有 C3 的注释;
  • 计算用于 C3 音符的层数,并在临时索引中创建或更新适当的文件;和
  • 使用临时索引进行新提交,其父提交是refs/notes/commit提交,然后更新refs/notes/commit以存储新提交的哈希 ID。

您现在已经更新了提交 C3 的注释,因此当git log显示提交 C3 时,如果它也显示注释,它将在您的新提交中读取 for-C3 文件。

于 2022-03-02T20:27:44.487 回答