如何在添加新文件后更新到mercurial中的最新版本?

时间:2012-01-17 06:28:49

标签: version-control mercurial dvcs

我在项目目录中创建了一个存储库。我添加了所有文件并做了一些提交。然后我将新文件添加到项目和存储库中。之后我回到了早期版本,现在我无法更新到最新版本。 hg update tip之后我收到此消息:

abort: untracked file in working directory differs from file in requested
revision: '.DS_Store'

我是善变的新手。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:12)

这意味着Mercurial不确定该怎么做。您在工作副本中有一个内容为something的文件。该文件不受版本控制,因此Mercurial通常会在您更新时不管它。但是,您要更新为 的修订版具有一个名称相同的文件,内容与文件中已有的something不同

如果你这样做可以解决这个问题

$ hg init
$ echo "a file" > a
$ hg add a
$ hg commit -m "added a"
$ echo "b file" > b
$ hg add b
$ hg commit -m "added b"

您现在有两个版本,最新版本有ab。如果您更新回第一个修订版并创建另一个文件b,那么您会遇到麻烦:

$ hg update 0
$ echo "other b file" > b
$ hg update
abort: untracked file in working directory differs from file in requested
revision: 'b'

正常的解决方案是在更新之前提交。通常不应使用脏工作副本进行更新(“脏”表示hg status不为空)。 Mercurial确实支持这样的更新,但只有在你知道自己在做什么的情况下才应该使用它们。

因此,要继续上面的示例,我们可以提交新的b,然后合并:

$ hg add b
$ hg commit -m "added new b"
$ hg merge

这会在b中产生冲突,因为这两个版本分别包含b fileother b file。解决冲突并提交:

$ hg commit -m "merged two bs"

另一种方法是从工作副本中删除该文件。 这就是我要处理的情况: .DS_Store文件不应该首先被跟踪。它们在Mac OS X上存储了一些文件夹信息,这不是源代码的一部分。所以你做了

$ rm .DS_Store
$ hg update

更新重新启动了.DS_Store文件。您现在想告诉Mercurial它应该停止跟踪文件:

$ hg forget .DS_Store

并且您还想告诉Mercurial从现在开始忽略这些文件:

$ echo "syntax: glob" >> .hgignore
$ echo ".DS_Store" >> .hgignore
$ hg commit -m "removed .DS_Store file, ignored from now on"