我有一个本地 mercurial 存储库,其中包含 5 个仍需要推送到服务器的提交。但是,自从最后 4 次提交以来,我不小心在两个特定文件中包含了一行,我真的不想在其中(也不在其中一个变更集中)。
有什么实用的方法可以删除这两个文件中的这些行吗?(除了扔掉我的本地存储库,克隆服务器的副本,并再次手动重新应用所有更改)
你会得到很多不同的建议(mq、histedit、导入/导出),它们基本上都做同样的事情。他们都会觉得很笨拙,因为 mercurial 是围绕着不可改变的历史的概念构建的——改变历史应该是困难的。也就是说,正如您正确理解的那样,如果您还没有推送 cset,这是可能的。这是我要使用的过程——我更喜欢它,因为它不需要启用任何扩展:
hg export --git -o ../all-five-csets.patch 0:tip
cd .. # exit the repo
vi all-five-csets.patch # delete the line manually each time it appears (probably only once)
hg init newrepo
cd newrepo
hg import ../all-five-csets.patch
cd ..
mv repo was-repo
mv newrepo repo
那里发生的所有事情都是您将 csets 导出为它们自己的文本表示形式。创建一个新的空仓库,然后重新导入 cset。我做了所有这些,因为你只有五个。如果您正在考虑更改 500 个中的最后 5 个,我会通过执行clone -r
“最多”克隆来创建 newrepo,然后通过导入应用我在编辑后的表单中留下的 cset。
如果这 5 个提交是否是独立的更改集并不重要,您可以使用hg collapse将它们折叠为一个不包含您想要避免推送的行的单个更改集。IE
hg collapse
折叠最后 6 个更改集(现有的 5 个本地更改集,加上刚刚删除这些行的新更改集)这将在您的本地机器上留下一个更改集,其中不包含您想要避免推送的那些行。
警告一句,使用 hg collapse 时要小心——你要确保不要折叠已经推送到另一个存储库的更改集。