如何使mercurial忽略任何扩展名为.xxx的文件

如何使mercurial忽略任何扩展名为.xxx的文件,mercurial,file-extension,hgignore,Mercurial,File Extension,Hgignore,我希望Mercurial忽略任何具有特定扩展名的文件 例如,我想忽略扩展名为.SUO的文件。(不需要对Visual Studio用户设置进行版本控制。) 因此,我将.hgignore文件更改为: syntax: glob *.suo 但是,这没有效果,Mercurial仍然可以看到我的.suo文件 我在这里做错了什么?检查.hgignore文件的位置,并确保它位于$HOME或项目根文件夹中。检查扩展的案例(vs案例)。我怀疑模式匹配是否不区分大小写 编辑:已测试,模式匹配不区分大小写。因此,如

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

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

因此,我将.hgignore文件更改为:

syntax: glob
*.suo
但是,这没有效果,Mercurial仍然可以看到我的.suo文件


我在这里做错了什么?

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


编辑:已测试,模式匹配不区分大小写。因此,如果要忽略扩展名为“.SUO”的文件,请添加“*.SUO”。

如果在更改.hgignore文件之前运行
hg status
时,.SUO文件前面有一个
,那么现在应该忽略它。如果其他任何内容(例如
M
A
)已被存储库跟踪,并且不会神奇地停止跟踪。在这种情况下,您需要对文件执行
hg remove
以删除它并让hg停止跟踪它,或者只执行
hg forget
以让hg停止跟踪它但保留文件。任何一个后面都应该跟一个commit

如果路径与.hgignore文件中的模式匹配,则状态列表中只会忽略未跟踪的文件。忽略跟踪的文件是没有意义的,因为您永远看不到它是否被修改、添加或删除

编辑:Mercurial只跟踪文件(您不能让它跟踪空目录),但是.hgignore中的模式只是针对相对于存储库根目录的文件路径字符串运行。当您运行
hg status
时,它会显示与您完全相同的相对路径。因此,它确实可以按照您所说的方式工作,因为以下几行是我自己的.hgignore文件的标准部分:

syntax: glob *\obj\* *\bin\* *.csproj.user *.suo 语法:glob *\obj\* *\垃圾箱\* *.csproj.user *索先生
同样,当您运行
hg status
并显示一个.suo文件时,该行开头有哪个字符?它是一个
M
a
R
字符?它后面的路径是什么?

Mercurial使用名为
.hgignore
的文件中的条目来确定它完全忽略了哪些文件。它通常位于存储库的根文件中(您可能认为,不是.hg目录中的

您可以在此处找到更多信息:

通常,我们使用正则表达式语法来确保大小写不是扩展中的一个因素:

# use regexp syntax.
syntax: regexp
(?i)\.dcu
(?i)\.identcache
(?i)\.dof
(?i)\.dsk
(?i)\.bak
(?i)\.old

这样,即使由于某种原因扩展名的情况发生了变化,它也会被忽略。

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

.*\.o$
应将.suo扩展名转换为
*\.suo$


我成功地使用了此方法

您试图忽略的文件是否在您的回购中被跟踪(添加)?顺便说一句,这是在Windows上,对吗?所讨论的文件都是小写的。我尝试将其更改为大写,但仍然不起作用。此外,.hgignore位于项目根文件夹中,它与“/bin$[linebreak]/obj$[linebreak]wwwroot$”完美配合。它似乎只适用于文件扩展名忽略。我尝试了上面的代码,但仍然不起作用。即使我创建了一个名为“test.dcu”的文件,它仍然将其包含在列表中。那么,您的.hgignore文件被忽略了。您是从命令行执行此操作的吗?可能会重置命令windows环境?但这不是我想要的行为。我希望被忽略的文件不会显示在hg状态列表中。这完全适用于忽略整个文件夹,例如调试,那么为什么不忽略.suo文件呢?我猜答案一定与Mercurial只注意文件而不注意文件夹这一事实有关?请注意,您不需要删除相关文件就可以让Mercurial停止跟踪它,您只需要让Mercurial忘记它。这将保留文件,但停止跟踪。Remove(
hg Remove
)相当于
hg forget
和文件系统删除。