Hg Mercurial将电子邮件地址更改为已推送的提交

时间:2018-07-03 09:36:57

标签: mercurial commit atlassian-sourcetree tortoisehg

在工作中,我在创建提交消息时使用我的工作电子邮件地址,但是在家里,我使用私人帐户来创建提交。
我忘记在提交和推送之前改回到我的工作电子邮件地址,然后我意识到我用自己的私人电子邮件地址推送了一个Merge提交,我希望将此提交消息基本上修改为我的工作电子邮件地址。 br /> 在Git中,当我需要从某些子提交重新确定基础然后强行推入它时,这非常容易,但它工作得很好,但是在Mercurial中,它似乎受到了更多限制,我很确定必须顺便说一句,正如我在Stackoverflow中看到许多类似的问题(例如修改提交)一样,我还使用一些著名的Mercurial扩展阅读了一些文章,例如:histeditevolverebase
我尝试过的其他操作也失败了:

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

为什么在汞方面如此复杂?
我也查看过的其中一篇文章是
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

1 个答案:

答案 0 :(得分:3)

一种可能的解决方案是重新创建要更改的提交,然后将其后的所有内容重新建立为该新提交。

仅当您知道有害提交已传播到的所有克隆,并且能够直接对其进行修改时,此方法才有效。


假设您具有以下历史记录:

%>%

其中B是错误的提交。

步骤:

  1. 更新为A
  2. 将本地更改还原为与B相同

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

  3. 解决原始问题-即正确设置电子邮件地址

  4. 提交。现在您的历史记录如下:

    A-B-C-D

  5. 将C重新设置为B'(A-B-C-D \ B'命令-THG对此也有屏幕)。所以现在您有了:

    hg rebase ...

  6. 使用A-B \ B'-C-D(仅适用于本地克隆)删除原始B

    hg strip

  7. 使用A-B'-C-D (1)

  8. 删除所有其他克隆上的B,C和D

(1)只有在您有权访问这些克隆并且在修订版D之后没有任何人提交任何内容时,这才有可能。或者,如果可以访问,则可以对其进行变基或从中删除它。方式。

也请谨慎使用hg strip,因为它具有破坏性。