Hg更新到先前提交删除任何更改

时间:2012-01-06 17:10:12

标签: mercurial

working directory

做了

hg commit (resulted in rev3)

复制了一些目录......改变了一些文件。

hg add  
hg commit (resulted in rev4 - tip)  

如何准确回到 rev3 的状态。 hg update 3会将文件更改为 rev3 中的状态,但它也会将所有复制的目录保留在内。我想获得没有复制的目录和文件的工作目录,这些目录和文件是在rev3之后添加的。

2 个答案:

答案 0 :(得分:2)

这对我来说不会发生:

> hg init
> mkdir first
> jed first/foo.txt
> hg add
   adding first/foo.txt
> hg commit -m asd
> mkdir second
> jed second/foo.txt
> hg add
   adding second/foo.txt
> hg commit -m asd
> hg update 0

现在first存在,但second不存在......

您确定在提交之前在新目录中添加了所有内容吗?

答案 1 :(得分:1)

像乔恩写的那样,Mercurial通常会尝试自行清理。因此,当你hg update时,你应该准确地回复你的承诺。我猜您所看到的是以下行为:

$ hg init repo
$ cd repo
$ echo "# some C program" > foo.c
$ hg add foo.c
$ hg commit -m first
$ mkdir dir
$ echo "$ other C program" > dir/bar.c
$ hg add dir/bar.c
$ hg commit -m second
$ echo "object file" > dir/bar.o
$ hg update 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ ls
foo.c  dir
$ ls dir
bar.o

因此,未跟踪的dir/bar.o文件已被遗忘,但已正确删除了跟踪的dir/bar.c文件。那就是:Mercurial 不会删除未跟踪的文件,因为它不知道它们是否包含有价值的数据。即使文件被.hgignore中的模式忽略,这也适用。如果目录只包含跟踪的dir/bar.c文件,那么当您更新到不需要它的修订版时,该目录将被完全删除。

清理未跟踪文件的常规方法是使用purge extension