【问题标题】:rewrite commit message when pulling拉动时重写提交消息
【发布时间】:2021-01-15 00:07:58
【问题描述】:

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

我的问题是是否可以同时重写提交消息,以便我可以在提交主题中添加标签或在提交正文中添加预告片。

编辑: 为了澄清我想用更改重写所有提交消息,而不是 pull 的合并消息

【问题讨论】:

  • 删除--no-edit
  • --no-edit是拉取时添加的合并消息,我想更改拉取时所有的提交消息,它们是数百个
  • 如果你还想保留你的合并提交,在你合并不相关的历史之后,你可以对所有的提交进行rebase并重新编写它们。
  • @Mcm 通过更改所有提交消息,git filter-branchgit rebase -i 可以提供帮助。但他们改写了整个历史。
  • 重写历史不是问题,但我只想重写我正在合并的特定存储库的提交,这样我就可以将 '#nnn' 之类的链接更改为 'github.../repo/issues/nnn' 。每个 repo 都有不同的链接

标签: git git-pull


【解决方案1】:

在拉取提交时,您无法更改提交消息。

这不可能是设计使然。当您更改提交消息时,此提交的哈希值会更改。仅在提交消息上不同的两个相同提交将具有不同的哈希值。所以 git 总是将这样的提交视为两个不同的提交。

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

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

我建议你按下一个顺序做:

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

【讨论】:

  • 谢谢,最后我采纳了你的建议,git filter-branch --msg-filter "perl -pe 's,([\( ]|)?(#\d+)([\) ]|),\$1mycompany/myproject/\$2\$3,g'" 成功了
  • @Mcm 我很高兴它有帮助
【解决方案2】:

任何提交的任何部分都无法更改,因此从这个意义上说,答案是否定的。

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

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

  • git fetch,获取新的提交;那么
  • 您选择的将这些复制到新的和改进的提交的方法;那么
  • git merge,如果需要,或者需要任何其他命令(可能没有)。

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

【讨论】:

    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2014-03-12
    • 2013-01-16
    • 2013-09-15
    • 1970-01-01
    相关资源
    最近更新 更多