我希望Mercurial忽略具有特定扩展名的任何文件。
例如,我想忽略扩展名为.SUO的文件。 (不需要版本控制Visual Studio用户设置。)
所以我将.hgignore文件改为:
syntax: glob
*.suo
但是,这没有效果,Mercurial仍然会看到我的.suo文件。
我在这里做错了什么?
答案 0 :(得分:26)
如果在更改.hgignore文件之前运行hg status
,.suo文件前面有?
,那么现在应该忽略它。如果还有其他内容(例如M
或A
),则它已被存储库跟踪,并且不会神奇地停止跟踪。在这种情况下,您需要对文件执行hg remove
以删除它,并让hg停止跟踪它,或者只是对其执行hg forget
以使hg停止跟踪它但保留文件。两者之后都应该提交。
如果路径与.hgignore文件中的模式匹配,那么将从状态列表中省略的唯一文件是未跟踪的文件。省略被跟踪的文件是没有意义的,因为你永远不会看到它是否被修改,添加或删除。
编辑:Mercurial只跟踪文件(你无法跟踪它们的空目录),但.hgignore中的模式只是针对文件路径的字符串相对于根目录运行库。运行hg status
时显示的相对路径非常相同。所以它确实有效,你说你希望它工作,因为以下行是我自己的.hgignore文件的标准部分:
syntax: glob *\obj\* *\bin\* *.csproj.user *.suo
同样,当您运行hg status
并显示.suo文件时,该行的开头有哪个单个字符?是M
,A
,R
,!
还是?
字符?它之后的路径是什么?
答案 1 :(得分:6)
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
这样,它确保即使由于某种原因扩展的情况发生变化,它仍然会被忽略。
答案 2 :(得分:5)
忽略/排除扩展名为.o的文件的示例:
.*\.o$
对于.suo扩展名,应转换为.*\.suo$
我已成功使用此方法
答案 3 :(得分:2)
检查.hgignore文件的位置,并确保它位于$ HOME或项目根文件夹中。检查扩展的CASE(vs case)。我怀疑模式匹配是否不区分大小写。
编辑:测试,模式匹配不区分大小写。因此,如果要忽略扩展名为“.SUO”的文件,请添加“* .SUO”。