如何让Mercurial忽略任何以.xxx扩展名结尾的文件。

21

我希望Mercurial忽略任何具有特定扩展名的文件。

例如,我想忽略具有.SUO扩展名的文件。(没有必要对Visual Studio用户设置进行版本控制。)

所以我将我的.hgignore文件更改为:

syntax: glob
*.suo

然而,这没有任何效果,Mercurial仍然看到我的.suo文件。

我在这里做错了什么?


你试图忽略的文件是否已经被你的代码库跟踪(添加)了? - John Zwinck
顺便问一下,这是在Windows上吗? - Joel B Fant
4个回答

27
如果在修改您的 .hgignore 文件之前运行 hg status,.suo 文件前面有一个 ?,则现在应该忽略它。 如果是其他任何字符(例如MA),则它已经由仓库跟踪,并且不会神奇地停止被跟踪。 在这种情况下,您需要对文件执行hg remove 以删除它并使 hg 停止跟踪它,或者只需对其执行hg forget 以使 hg 停止跟踪它但保留该文件。 任何一种方法都应遵循提交。
如果匹配 .hgignore 文件中模式的路径是未跟踪的文件,则将省略状态列表中的唯一文件。省略跟踪的文件没有任何意义,因为您永远不会知道它是否已被修改、添加或删除。
编辑:Mercurial 仅跟踪文件(你不能让它跟踪空目录),但是 .hgignore 中的模式只是相对于存储库根目录的文件路径字符串运行的。与运行 hg status 时显示给您查看的相同相对路径。因此,它确实按照您希望的方式工作,因为以下行是我自己 .hgignore 文件的标准部分:
语法:glob
*\obj\*
*\bin\*
*.csproj.user
*.suo
同样,在运行hg status并显示.suo文件时,该行开头是什么单个字符? 是 MAR! 还是? 字符?它后面的路径是什么?

但这不是我想要的行为。我希望被忽略的文件在hg状态列表中不会显示出来。对于忽略整个文件夹(如debug文件夹)来说,这完全正常工作,那么为什么.suo文件不行呢?我猜答案可能与Mercurial只注意文件而不是文件夹有关吧? - Jonathan
注意,您不需要删除有问题的文件来停止Mercurial跟踪它,您只需要求Mercurial忘记它即可。这将使文件保留在原地但停止跟踪。“remove”(hg remove)等同于“forget”和文件系统删除。 - Lasse V. Karlsen

8
Mercurial使用名为.hgignore的文件条目来确定完全忽略哪些文件。该文件通常位于存储库的根文件夹中(而不是您可能认为的.hg目录)。 您可以在此处了解更多信息: http://www.selenic.com/mercurial/hgignore.5.html 通常,我们使用正则表达式语法确保扩展名的大小写不受影响:
# use regexp syntax.
syntax: regexp
(?i)\.dcu
(?i)\.identcache
(?i)\.dof
(?i)\.dsk
(?i)\.bak
(?i)\.old

那样一来,就可以确保即使扩展名的大小写发生变化,它仍然会被忽略。

我尝试了上面的代码,但它仍然无法工作。即使我创建一个名为“test.dcu”的文件,它仍会将其包含在列表中。 - Jonathan
1
那么你的 .hgignore 文件被忽略了。 - Nick Hodges
你是在命令行中执行吗?也许重置命令窗口环境会有帮助。 - Nick Hodges

5

忽略/排除扩展名为 .o 的文件示例:

.*\.o$

应该将“.suo”扩展名翻译为.*\.suo$的形式。我已经成功使用了这种方法。


2

检查.hgignore文件的位置,并确保它位于$HOME或项目根目录中。检查扩展名的大小写。我怀疑模式匹配是否不区分大小写。

编辑:经过测试,模式匹配是不区分大小写的。因此,如果您想忽略具有“.SUO”扩展名的文件,请添加“*.SUO”。


问题文件名全部为小写。我尝试将其改为大写,但仍然无法正常工作。 - Jonathan
同时,.hgignore 文件位于项目根文件夹中,并且可以与以下内容完美配合使用:'/bin$ [linebreak] /obj$ [linebreak] wwwroot$'。它似乎不能与文件扩展名忽略一起正常工作。 - Jonathan

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