hg forget和hg remove有什么区别?

322

我希望使用mercurial从当前仓库中删除几个文件。但是,我想让这些文件存在于以前的历史记录中。

forgetremove有何不同,它们能否实现我的要求?


27
不用担心,在Mercurial中你无法从先前的历史记录中删除文件——通常情况下,历史记录是不可变的,除非你开始使用扩展功能。 - Martin Geisler
5个回答

355
'hg forget' 是 'hg remove -Af' 的简写。从 'hg remove' 命令的帮助中可以看到:“...并且可以使用 '-Af' 选项在不删除工作目录中的文件的情况下,将它们从下一个修订中删除。”因此,“remove” 命令会从磁盘的工作副本中删除文件(除非你使用了 -Af),而“forget” 则不会删除文件。

7
"hg forget"在Mercurial 1.3中重新引入,作为执行"hg remove -Af"更简单的方式。它将文件计划删除,但不会从工作副本中删除。 - Martin Geisler
3
我需要指出的是,这种方法并不适用于忽略两个代码库中常见文件的更改,因为当你在push或pull另一个库时,这些文件将被删除。这只是删除文件而不会清除你本地工作区的副本(在我的情况下,我们有一些配置文件需要在该可恶的远程库中编辑以适应本地环境,但这不是我的决定)。我认为称这个命令为“forget”非常误导人。 - Erik Reppen
如果我已经在本地删除了一些文件来测试构建,那么是使用“forget”更好还是从服务器上获取它们并“remove”它们? - The incredible Jan

45

用最好的方式来表述,hg forgethg remove完全相同的,只有一个不同之处,那就是它会在您的工作副本中保留文件。这些文件会作为未跟踪的文件留下来,并且现在可以使用.hgignore中的模式选择性地忽略。

换句话说,当我从您那里拉取时,我无法分辨您是否使用了hg forgethg remove。您在上述变更集上运行hg forget的文件将会被删除 - 就像您使用hg remove一样。


27

从文档来看,似乎可以使用其中任一命令将文件保留在项目历史中。看起来你想使用remove,因为它还会从工作目录中删除该文件。

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

删除文件不会影响其历史记录。重要的是要理解,删除文件只有两个效果。它会从工作目录中删除文件的当前版本。它会停止Mercurial跟踪文件的更改,从下一次提交开始。删除文件不会以任何方式更改文件的历史记录。

man页hg(1)对forget的说明如下:

标记指定的文件,以便它们在下一次提交后不再被跟踪。这仅会从当前分支中删除文件,并不会从整个项目历史中删除它们,也不会从工作目录中删除它们。

关于remove的说明如下:

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


4
如果你对一个状态为"A"的文件使用"hg remove b"命令,即该文件已添加但未提交,Mercurial会做出响应:
  not removing b: file has been marked for add (use forget to undo)

这个回复非常清晰地解释了remove和forget之间的区别。
我的理解是,"hg forget"用于撤销已添加但未提交的文件,以便它不受版本控制跟踪; 而"hg remove"用于从版本控制中删除已提交的文件。
这个thread有一个示例,演示如何使用hg remove来处理7种不同状态的文件。

4

文件可以被跟踪或不被跟踪,您可以使用 hg add 来跟踪一个文件,使用 hg remove hg forget来取消跟踪。不带标志地使用 hg remove 将同时删除文件和取消跟踪, hg forget 将只是简单地取消跟踪而不删除它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接