Mercurial 忽略文件

67

我试图让Mercurial忽略一个配置文件,但是我无法使它正常工作。

我在服务器上使用hg init创建了一个仓库,并将该仓库克隆到了我的计算机上。我想编辑配置文件,但不想将更改提交回服务器。

我已经尝试在克隆的根目录下创建.hgignore文件,但是Mercurial用?标记该文件,无论我是否提交它,它仍然继续记录我的配置更改。

我是在错误的位置创建.hgignore文件吗?这个文件需要被提交吗?它需要在我在服务器上初始化仓库之前创建吗?

3个回答

70
  • 在初始化之前不需要创建.hgignore文件
  • 如果配置文件将被他人使用,则最好提交.hgignore文件,这样其他人就不必创建它了。但是对于Mercurial来忽略您的本地文件,这并非必需(请参见示例)
  • 是的,.hgignore必须在根目录中

简单示例。

初始化存储库:

$ mkdir test 
$ cd test 
$ hg init 

创建一个文件

$ touch foo 
$ hg st 
? foo 
现在,在您的代码库的根目录中创建一个名为.hgignore的文件:
$ echo 'foo' > .hgignore 

foo现在被忽略:

$ hg st 
? .hgignore 

请注意,这不需要提交 .hgignore 文件也可以生效。

稍微有点棘手

如果配置文件和一个忽略该配置文件的 .hgignore 文件都被提交到仓库中,则会跟踪配置文件更改(换句话说,.hgignore 将没有效果)。

创建配置文件并将其提交。

$ touch config
$ hg ci config -Am 'adding conf'

忽略它:

$ echo 'config' >> .hgignore

提交 .hgignore 文件:

$ hg ci .hgignore -Am '.hgignore'

如果您克隆该仓库:

$ cd ..
$ hg clone test other-user
$ cd other-user

并修改配置:

$ echo 'new config param' >> config

然后 hg 将显示更改:

$ hg st
M config

如何处理这个问题?

您可能希望有一个主要的默认配置文件,即global.cfg,它是版本化的,并在代码库中保存。

然后您可以要求用户创建一个local.cfg文件,他们将在其中放置其本地设置。如果存在local.cfg,则您的脚本将使用它:本地设置会覆盖全局设置。当然,添加一行到.hgignore以忽略local.cfg;)

另一种选择:没有全局配置文件,只有一个config.example文件,用户需要复制并在本地修改。不过这个方法的缺点是你不能轻易地跟踪版本间的更改。


1
配置文件应该是主存储库的一部分吗?如果是的话,如果我拉下来,它不就已经成为克隆的一部分了,所以hgignore将没有效果? - Tom
True,它没有任何影响。请查看我的编辑以获取可能的解决方案 :) - Nicolas Dumazet
2
最好的方法是让你的应用程序首先加载global.cfg,然后如果存在local.cfg,则加载它。然后将global.cfg添加到Mercurial并将“local.cfg”添加到.hgignore中。这将使您可以在global.cfg中对默认值进行版本控制,而用户仍然可以在local.cfg文件中根据需要覆盖它们。重要的是要记住,.hgignore只能忽略Mercurial未跟踪的文件。因此,如果将“*.cfg”添加到.hgignore中,则global.cfg文件仍将像往常一样提交。 - Martin Geisler
它不必在根目录中。当我克隆时仍然无法使我的工作,但是当我没有将配置文件放在对应的目录中时就会出现错误提示,所以我肯定做错了其他事情。 - Erik Reppen

29
即使您忽略了某些文件,一旦它们被添加到存储库中,Mercurial也会跟踪它们。
要从存储库中删除配置文件,您可以使用:
hg remove -Af file.cfg

这将从仓库中删除该文件(一旦提交),但不会删除本地文件。请参阅hg help remove。然而,现在仓库中记录了删除操作,当你或其他人跨越该版本更新时,Mercurial将删除该文件

你也可以将其重命名,并让其他人将主文件复制到他们的本地文件,但是你需要协调本地文件的更新。

hg rename file.cfg file.cfg.example

15

将 .hgignore 文件本身添加到 .hgignore 文件中:

syntax: glob

.hgignore

或者,只需将.hgignore文件检入到您的本地克隆中...


1
根据您的要求,不想将 .hgignore 推回任何源,我建议采用这种简单方法。使用一个本地的 .hgignore 文件,您不需要提交它,并添加任何您想要的内容,将 .hgignore 放在第一位。如果您将 .hgignore 加入到本地克隆中,可能会无意中将其推回某一天。 - maxwellb

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