12

我讨厌看到我的存储库中的几乎每个目录都将每个文件列出两次,一次前面有一个点,一次没有。我尝试添加.*到我的 .hgignore 文件中,但没有效果。这是错误的语法吗?更重要的是,一开始就尝试这样做是不是一个坏主意?谢谢。

4

2 回答 2

19

您在 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
于 2010-03-07T16:27:54.093 回答
0

我在我的.hgignore

syntax: regexp

# dotfiles
(?<![^/])\.

其内容为:句点前面没有除正斜杠之外的其他内容。

Ry4an的方案也不错,我以前也用过。不确定哪个更有效。

https://regex101.com/r/dB4bW7/1

于 2016-04-05T17:47:44.817 回答