【问题标题】:Hg Mercurial changing E-Mail address to an already pushed commitHg Mercurial 将电子邮件地址更改为已推送的提交
【发布时间】:2018-12-11 13:42:22
【问题描述】:

在工作中,我在创建提交消息时使用我的工作电子邮件地址,但在家里我使用我的私人帐户来创建提交。
在提交和推送之前,我忘记改回我的工作电子邮件地址,然后我意识到我用我的私人电子邮件地址推送了 Merge 提交,我想基本上将此提交消息修改到我的工作电子邮件地址。
Git 中,当我需要从某个子提交变基然后强制推送它时非常容易,它工作得非常好,但在Mercurial 中,它似乎受到更多限制,我很确定一定有办法,当我在 Stackoverflow 中看到许多类似的问题(例如修改提交)时,我还阅读了一些使用一些著名的 Mercurial 扩展的文章,例如:histeditevolverebase
我尝试的其他一些事情也失败了:

  • 使用hgext.convert 创建一个我不想要的新存储库 而且它也未能在我的一个变更集中完成。
  • 使用histedit 会引发无法修改公共更改的错误。
  • 使用hgext.mq会抛出无法导入合并的错误 修订。

为什么在 mercurial 中如此复杂?
我也查过的一篇文章是这样的:
https://book.mercurial-scm.org/read/changing-history.html

请注意,我已经理解它的含义以及当其他人在此存储库上工作时它会有多么危险,所以请尝试从我这里保存它:)

另一个注意事项,我通常使用SourceTree,有时使用命令行,所以如果你是那种 SourceTree 人,我也很乐意听到你的解决方案。

并且请尽量避免将此问题标记为重复,因为我已经使用过搜索并且看到了许多不同的解决方案并没有真正澄清这一点。

是否有与Git 类似的方式,基本上从特定提交重新设置并强制推送,以便我可以将我的电子邮件更改回我的工作电子邮件地址?

提前感谢您花费时间和精力提供帮助! :)

编辑 1:
我尝试使用基于@DaveInCaz 解决方案的推送更改在测试公共存储库上重现它,但失败了:
步骤:

// Updating to the wrong commit message.
hg update -r B

// Throwing all changes that has been made on the wrong commit.
hg strip B

// Re-creating the Merge again with the correct mail address.
hg merge new-feature

// Assuming now it creates revision B2
hg commit -m 'Merge'

// Pulling the changes again
hg pull

// Making the correct commits afterwards to be the children from B2 instead B.
hg rebase -s C -d B2

// Removing the old B
hg strip B

当然,如果我尝试hg push,我会得到以下abort: push creates new remote head

【问题讨论】:

  • 转换扩展失败将是一个错误。进化扩展应该能够做到这一点(干净,通过过时的原始发布提交;您将拥有原始提交及其替换,在这种情况下,这对于您的目的可能是不必要的)。您还可以强制将提交的 阶段 从已发布更改为草稿或机密,然后使用 histedit。这可能是最简单也是最好的方法。
  • 我看到你把git标签放回去了。我认为它不属于这里:您的问题不是 关于 Git,您只是将 Git 用作您希望事情如何工作的参考。 (同时,您是否尝试过强制阶段回到轮抽?注意:您可能还希望在任何推动的目标上执行此操作。这就是进化的优势所在:减少手动操作。)
  • 您可以使用hg phase -f draft <revs> 将给定的修订设置回草稿阶段。然后,您可以根据需要编辑它们。请注意,如果您已将它们转移到另一个 hg 存储库,那么您也必须将它们从该存储库中删除。如果它们在尖端,您可以安全地剥离它们;如果没有,请确保您正在操作的任何存储库都具有所有后续提交,以便您可以剥离所有内容并将其从经过手术更改的现在正确的存储库中放回。 (当然,如果他们不在草稿阶段,这通常意味着您已经转移了他们。)
  • Evolve 应该有帮助,虽然我从未使用过它。从功能上讲,evolve 背后的想法是新的提交可以超过之前的提交,从而将其隐藏起来。旧的提交仍然存在,并被转移到所有其他克隆,但所有使用进化扩展的克隆都知道过时的提交已经过时,新的替换是要使用的。这里的缺点是每个存储库都必须支持扩展。

标签: mercurial commit atlassian-sourcetree tortoisehg


【解决方案1】:

一种可能的解决方案是重新创建您要更改的提交,然后将其后的任何内容重新设置为该新提交。

只有当您知道不需要的提交传播到的所有克隆,并且您有能力直接修改它们时,这才有效。


假设您有以下历史记录:

A-B-C-D

其中 B 是有错误的提交。

步骤:

  1. 更新到 A
  2. 将本地更改恢复为与 B 相同

    (例如,在 THG 中,您可以右键单击历史记录并选择“还原所有文件...”)

  3. 修复原来的问题——即正确设置邮箱地址

  4. 提交。现在你的历史看起来像这样:

    A-B-C-D \ B'

  5. 将 C 变基为 B'(hg rebase ... 命令 - THG 也有此屏幕)。所以现在你有:

    A-B \ B'-C-D

  6. 使用 hg strip 删除原始 B(仅限本地克隆)

    A-B'-C-D

  7. 使用hg strip 删除所有其他克隆上的 B、C 和 D(1)

  8. 推送


(1) 这只有在您有权访问这些克隆并且没有人在修订版 D 之后提交任何内容的情况下才有可能。或者如果他们有,您可以重新设置它或以其他方式将其从方式。

还要小心strip,因为它具有破坏性。

【讨论】:

  • 嘿@DaveInCaz,我假设您的答案基于存储库而不发布更改?我编辑了原始问题,以便您可以查看我的步骤来尝试重现您在此处所说的内容。
  • 第 7 步解决了已将本地更改推送到其他克隆(发布)的问题。在问题编辑中,在再次拉动之前,它看起来并没有得到照顾。
猜你喜欢
  • 1970-01-01
  • 2013-02-28
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 2020-04-13
  • 2011-09-09
相关资源
最近更新 更多