我讨厌看到我的存储库中的几乎每个目录都将每个文件列出两次,一次前面有一个点,一次没有。我尝试添加.*
到我的 .hgignore 文件中,但没有效果。这是错误的语法吗?更重要的是,一开始就尝试这样做是不是一个坏主意?谢谢。
2 回答
您在 gavinb 的评论中得到了几乎正确的答案,但比赛有点过于广泛。但是,RogerPage 再次在评论中提供了关于面部后忽略的关键概念(每个人都更喜欢评论而不是答案是什么?)。
让我们看看这九个文件:
dir.with.dots/file.with.dots
dir.with.dots/filewithoutdots
dir.with.dots/.filestartwithdot
dirwithoutdots/file.with.dots
dirwithoutdots/filewithoutdots
dirwithoutdots/.filestartwithdot
.startwithdot/file.with.dots
.startwithdot/filewithoutdots
.startwithdot/.filestartwithdot
如果在 hgignore 的默认正则表达式模式下,您可以:
\..*
您忽略了这九个文件中的八个:
$ hg stat -i
I .hgignore
I .startwithdot/.filestartwithdot
I .startwithdot/file.with.dots
I .startwithdot/filewithoutdots
I dir.with.dots/.filestartwithdot
I dir.with.dots/file.with.dots
I dir.with.dots/filewithoutdots
I dirwithoutdots/.filestartwithdot
I dirwithoutdots/file.with.dots
这比您说的要广泛。它忽略了任何带有点的东西。
要忽略以点开头的所有文件和目录(不是您所说的,而是您似乎想要的),请使用此正则表达式模式:
(^|/)\.
这表示文字点之前的内容必须是行的开头 ( ^
) 或斜线。
$ hg stat -i
I .hgignore
I .startwithdot/.filestartwithdot
I .startwithdot/file.with.dots
I .startwithdot/filewithoutdots
I dir.with.dots/.filestartwithdot
I dirwithoutdots/.filestartwithdot
这仅捕获以点开头的文件或目录。
但是,出现的另一个关键概念是 .hgignore 在添加文件后无效。它将阻止通过通配符添加,但您始终可以使用显式覆盖 .hgignore hg add
。并且一旦添加了文件,就不再咨询 hgignore。
这实际上非常方便,因为您可以广泛地忽略(例如.*\.jar
:),然后手动添加您想要的异常,而不必使用您的 hgignore 文件。但是,在这种情况下,这意味着您需要hg rm
意外添加的文件,并且 tonfa 展示了如何执行此操作(只要文件名中没有空格)。
最后,听起来你想要的 .hgignore 文件是:
(^|/)\._
并且您需要删除已添加的那些:
find . -type f -name "._*" -print0 |xargs -0 hg rm
我在我的.hgignore
:
syntax: regexp
# dotfiles
(?<![^/])\.
其内容为:句点前面没有除正斜杠之外的其他内容。
Ry4an的方案也不错,我以前也用过。不确定哪个更有效。