给定一个附有注释的提交,我可以在进行变基时将注释中的消息合并到提交的消息中吗?
这个问题的背景是我有一个通过 git-tfs 导入的大型存储库,其中有大量链接到单个提交的注释,当我清理存储库时,我想解决这些注释并将它们合并到相应的提交中消息。
给定一个附有注释的提交,我可以在进行变基时将注释中的消息合并到提交的消息中吗?
这个问题的背景是我有一个通过 git-tfs 导入的大型存储库,其中有大量链接到单个提交的注释,当我清理存储库时,我想解决这些注释并将它们合并到相应的提交中消息。
目前没有,没有。没有根本原因不能做到这一点,但对提交时的注释的支持仍然是一种原始的。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 中,您将:
xx/xx/xx/xx
要使用的层数(这会有所不同:每当树在任何给定级别都“过于拥挤”;实际级别隐含在文件名中,但如果您从不拆分或连接名称,则不必担心这一点);refs/notes/commit
提交,然后更新refs/notes/commit
以存储新提交的哈希 ID。您现在已经更新了提交 C3 的注释,因此当git log
显示提交 C3 时,如果它也显示注释,它将在您的新提交中读取 for-C3 文件。