拉动时重写提交消息

rewrite commit message when pulling

我正在将多个存储库合并为一个。为此,我添加了每个原始回购 git add ...,然后我 运行 git pull --no-edit --quiet --allow-unrelated-histories ...

我的问题是是否可以同时重写提交消息,以便我可以为提交主题添加标签或为提交主体添加尾部。

编辑: 澄清一下,我想用更改重写所有提交消息,而不是 pull

的合并消息

任何提交的任何部分都不能更改,所以从这个意义上说,答案是否定的。

git pull 命令实质上由 运行 git fetch 后跟 git mergegit rebase 组成。 rebase 命令通过 copying 现有提交到新的(和不同的,并且可能是改进的)提交来工作,所以从这个意义上说,有一种方法可以得到你想要的东西。但是 git pull 运行的 rebase 仅复制 your 提交,而不是获取的提交;您似乎想将获​​取的提交复制到 new-and-improved 提交,具有不同的哈希 ID。

为此,您必须将操作分开。停止使用 git pull。 运行:

  • git fetch,获取新的提交;然后
  • 您选择的将这些复制到 new-and-improved 提交的方法;然后
  • git merge,如果需要,或 需要的任何其他命令(可能 none)。

作为一般规则,每当您尝试做一些花哨的事情时,关于如何让 git pull 做到这一点的问题的答案就是“停止使用 git pull”。想一想 git pull 的作用,并将其分解为有用的部分和无用的部分:通常 fetch 有用,有时第二个命令有用,但通常你想要在两者之间插入一些东西。

拉取提交时不能更改提交消息。

设计一定是不可能的。当您更改提交消息时,此提交的哈希值也会更改。仅在提交消息上不同的两个相同提交将具有不同的哈希值。所以 git 始终将此类提交视为两个不同的提交。

pull 应该将远程存储库中的更改合并到您的本地存储库中。如果您在拉取过程中重写提交消息,它将更改这些提交的哈希值。从 git 的角度来看,您最终会在本地存储库中获得另一个历史记录。说明合并没完成,你再拉一下。

因此,您无法在拉取提交时更改提交消息。但是您可以在拉取后重写提交消息。您可以使用 git filter-branch--msg-filter 选项来重写提交消息。

我建议您按照下一个顺序进行:

  1. 从一个存储库中提取提交
  2. 使用 git filter-branch 重写来自此存储库的提交。 (这一次,您的历史记录中只有 "#nnn" 这样的链接,因此您可以轻松地将它们更改为 ""#nnn" ])
  3. 从下一个存储库中提取提交,然后重写这些提交(这次,来自先前存储库的链接已经处理,因此您可以将它们与来自当前存储库的链接分开)