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