从 Mercurial 分支中的多个(所有)提交中删除文件?

Remove file from multiple (all) commits in a branch in Mercurial?

我看过 Remove file from a commit in Mercurial - 但我对 Mercurial 的经验很少,所以我想问问并确定这是否可行,以及如何实现。

有一个软件是用Mercurial开发的,我想尝试添加一个功能。所以当我克隆 repo 时,首先我添加了我自己的分支,并开始在那里进行黑客攻击。已经在这个分支的第一次或第二次提交中,我添加了多个文件 hg add test1.bmphg add test2.bmp 等等,然后提交。

然后我继续破解其他文件(从那以后就没有碰过这些 test1.bmp、test2.bmp 等),并在添加 bmp 的提交之后进行了大约 3 或 4 次提交。没有任何东西被推送到任何地方——我的 Mercurial 存储库的本地副本和我在其中的分支是唯一引用这些文件的地方。刚才我意识到我根本不应该添加这些文件。

是否可以从添加这些文件的第一次提交后的所有提交中删除这些文件?

或者也许我应该用单数形式提出问题 - 是否可以从添加文件的第一个提交开始的所有提交中删除文件? (如果可以删除一个文件,那么我可以对我想删除的任何其他文件重复该过程)

是的,这是可能的。

但是,这是 mercurial 的一种更高级的用法,需要您至少启用一个扩展。

作为新用户,我的建议是简单地使用 mercurial 基本管理并删除相关文件:

hg remove <file>

然后您可以提交更改。

虽然这不会从所有变更集中删除文件,但会删除它 往前走。老实说,这是管理工作内容的推荐方式。

应该注意的是,如果您已将更改推送到父存储库,这可能是您唯一的选择。如果您已将更改推送到父存储库,您还必须对其进行编辑,这会使事情变得更加复杂,并且更有可能出现严重错误。

如果你真的想从以前的变更集中删除它,你需要启用 histedit 扩展(包含在 mercurial 中)。

[extensions]
histedit =

由于您是 mercurial 的新用户,我强烈建议您备份您的存储库并在那里进行试验,然后再尝试在您的工作副本上进行此操作。

为此我推荐的流程如下:

注意:这仅适用于尚未推送且阶段 = 草稿(或机密)的变更集

1) 确定添加或修改文件的所有更改

您将需要知道修改或添加文件的每个变更集。您将需要按照添加它们的相反顺序修改每个变更集。

您可以使用:

hg log file

列出修改或添加文件的变更集。

2) 慢慢编辑每个受影响的变更集(向后工作)

使用 histedit 显示所有显示所有可以在默认编辑器中 modified/edited 的变更集。

hg histedit

找到您确定的第一个变更集并将其从选择更改为编辑并保存更改。

这将使您进入 histedit 编辑模式。这是提交变更集之前的状态。这意味着您可以进行修改、修改等更改。添加或删除内容。在这种情况下,我们要撤消对相关文件的任何更改。

hg revert file

hg remove file (if this is the changeset where the file as added)

3) 重新提交变更集

一旦你撤销了文件changes/additions,你需要通知histedit 你完成了。

hg histedit --continue

这将导致更改集重新提交您所做的修改,包括编辑提交消息。 对每个变更集重复此操作直到完成。

注意:虽然您可以 select 在 histedit 中编辑多个更改,但我建议一次进行一个更改以帮助降低复杂性。请记住按照他们承诺的相反顺序进行操作,以帮助减少/消除任何合并冲突。

再次建议您在存储库副本上练习,直到您牢牢理解该过程。由于您正在修改存储库历史记录,因此可能会产生错误的潜在负面影响。

我强烈推荐阅读这篇文章:https://book.mercurial-scm.org/read/changing-history.html