我希望mercurial从存储库的当前状态中删除几个文件。但是,我希望这些文件存在于以前的历史记录中。

忘记和删除有什么不同,它们能做我想做的事吗?


在文档中,显然可以使用任意一个命令将文件保存在项目历史记录中。看起来您想要删除,因为它也会从工作目录中删除文件。

从Mercurial的书http://hgbook.red-bean.com/read/:

删除一个文件不会影响它 历史。重要的是 理解删除文件 只有两个效果。它去掉了 文件的当前版本 工作目录。停止Mercurial 从跟踪文件的更改, 从下次提交时开始。 删除文件无论如何都不会 修改文件的历史记录。

手册页hg(1)说忘记:

标记指定的文件,这样他们就会 以后再也不会被跟踪了 提交。这只删除文件 当前的分支,不从 整个项目历史,确实如此 而不是从工作中删除它们 目录中。

这是关于移除的:

安排指定的文件 从存储库中删除。这 仅从当前删除文件 分支,不是整个项目 历史。

'hg forget'只是'hg remove -Af'的缩写。从'hg remove'帮助:

...和-Af可以用来删除文件 从下次修订没有 从工作中删除它们 目录中。

底线:'remove'从磁盘上的工作副本中删除文件(除非你使用-Af), 'forget'不会。

最好的方法是hg forget和hg remove是一样的,只是它把文件留在你的工作副本中。这些文件将作为未跟踪的文件留下来,现在可以使用.hgignore中的模式选择性地忽略它们。

换句话说,我不知道当我从你身上拉的时候,你是用hg forget还是hg remove。当我更新到该更改集时,您运行hg忘记的文件将被删除-就像您使用hg删除一样。

如果你对一个“a”状态的文件使用“hg remove b”,这意味着它已经被添加但还没有提交,Mercurial会回应:

  not removing b: file has been marked for add (use forget to undo)

这个回答非常清楚地说明了remove和forget之间的区别。

我的理解是“hg forget”是为了撤销已添加但未提交的文件,这样它就不会被版本控制跟踪;而“hg remove”用于从版本控制中取出已提交的文件。

这个线程有一个例子,使用hg删除文件的7个不同类型的状态。

一个文件可以跟踪或不跟踪,你使用hg add来跟踪一个文件和 Hg删除或Hg忘记取消跟踪。使用汞去除无 标记将删除文件和取消跟踪它,hg忘记将 只需取消跟踪而不删除它。