我见过Remove file from a commit in Mercurial-但是我对Mercurial的经验很少,所以我想问一下并确定这是否可行以及如何实现。
有一个用Mercurial开发的软件,我想尝试添加一个功能。因此,当我克隆存储库时,首先添加了自己的分支,然后开始在该处进行黑客入侵。在此分支的第一次或第二次提交中,我添加了多个文件hg add test1.bmp
,hg add test2.bmp
等,然后提交。
然后,我继续破解其他文件(此后再也没有碰过这些test1.bmp,test2.bmp等),并且在添加了bmp的提交之后进行了大约3或4次提交。什么都没有推到任何地方-我的Mercurial存储库的本地副本及其分支是唯一引用这些文件的地方。而现在我意识到我根本不应该添加这些文件。
是否可以将这些文件从具有它们特征的所有提交中删除,因为它们是在第一次提交时添加的?
或者我应该以单数形式提出问题-是否可以从文件的所有提交中删除文件,因为第一次提交是在文件添加的地方进行的? (如果可能有一个文件,那么我可以对要删除的其他文件重复该过程)
答案 0 :(得分:1)
是的,这是可能的。
但是,这是对Merurial的更高级使用,将要求您至少启用一个扩展。
作为新用户,我的建议是仅使用Mercurial基本管理并删除相关文件:
hg remove <file>
然后您可以提交更改。
虽然这不会从所有变更集中删除文件,但会删除它 向前走。说实话,这是管理工作内容的推荐方法。
应该注意,如果已将更改推送到父存储库,这可能是唯一的选择。如果您已将更改推送到父存储库,则还必须对其进行编辑,这会使事情变得更加复杂,并且更有可能发生严重错误。
如果您确实要从以前的变更集中删除它,则需要启用histedit扩展(包含在mercurial中)。
[extensions]
histedit =
由于您是Mercurial的相对较新的用户,因此我强烈建议您备份存储库并在那里进行实验,然后再对工作副本进行尝试。
我为此建议的过程如下:
注意:这仅适用于未推送且阶段=草稿(或机密)的变更集的描述
1)确定添加或修改文件的所有更改
您将需要了解每个变更集,其中文件在何处进行了修改或添加。您将需要按照添加时的相反顺序修改每个变更集。
您可以使用:
hg log file
列出修改或添加文件的变更集。
2)慢慢编辑每个受影响的变更集(向后移动)
使用histedit显示所有显示的所有变更集,这些变更集可以在默认编辑器中进行修改/编辑。
hg histedit
找到您确定的第一个变更集,然后将其从pick更改为编辑并保存更改。
这将使您进入组织编辑模式。这是刚提交变更集之前的状态。这意味着您可以进行更改,例如修改,统一。添加或删除内容。在这种情况下,我们要撤消对相关文件的任何更改。
hg revert file
或
hg remove file (if this is the changeset where the file as added)
3)重新提交变更集
一旦撤消了文件更改/添加,则需要通知histedit 你完成了。
hg histedit --continue
这将使更改集重新提交您所做的修改,包括编辑提交消息。 对每个变更集重复此操作,直到完成。
注意:尽管您可以选择多个更改以在histedit中进行编辑,但我建议一次执行一次以帮助降低复杂性。请记住按照相反的顺序进行操作,即致力于减少/消除任何合并冲突。
再次建议您对存储库副本进行练习,直到您完全了解该过程为止。由于您正在修改存储库历史记录,因此可能会产生错误的潜在负面影响。
我强烈建议您阅读以下内容:https://book.mercurial-scm.org/read/changing-history.html。