hgignore:帮助忽略所有文件,但忽略某些文件

Jas*_*n S 43 regex mercurial hgignore

我需要一个.hgdontignore文件:-)来包含某些文件并排除目录中的所有其他内容.基本上我想只在特定目录中包含.jar文件而不包含任何其他内容.我怎样才能做到这一点?我不熟悉正则表达式语法.或者我可以使用glob语法吗?(我更喜欢可读性)

就像一个示例位置,假设我想要排除foo/bar/除以外的所有文件foo/bar/*.jar.

Ry4*_*ase 42

迈克尔的答案很好,但另一种选择是排除:

foo/bar/**
Run Code Online (Sandbox Code Playgroud)

然后手动添加.jar文件.您始终可以添加被忽略规则排除的文件,并覆盖忽略.您只需记住添加您将来创建的任何罐子.

  • 如果不清楚,没有参数的'hg add'将不适用于匹配.hgignore模式的文件.'hg add <filename>'将添加该文件,正如Ry4an所提到的那样,它将被视为普通的存储库文件,因为.hgignore仅影响添加. (6认同)
  • 不,一旦它被添加它被跟踪,所以如果有人修改了已添加的foo/bar/path/specific.file,它将被检测为已更改.添加_completely_覆盖忽略. (5认同)
  • Mecki,添加'hg add'工作正常 - 它会覆盖忽略 - 只要您不在添加行中使用通配符.所以把foo/bar/**放在.hgignore中,然后'hg add foo/bar/path/specific.file',你就可以了.如果您要添加大量例外,可以将'hg status -u -n foo/bar/lots - *.jar'传递给'xargs hg add'并批量执行显式覆盖. (4认同)

Mic*_*oie 37

为此,您需要使用此正则表达式:

foo/bar/.+?\.(?!jar).+
Run Code Online (Sandbox Code Playgroud)

说明

你告诉它要忽略什么,所以这个表达式正在搜索你想要的东西.

  1. 您查找其名称(包括相对目录)包含的任何文件(foo/bar /)
  2. 然后,您可以查找一段时间之前的任何字符(.+?\.==匹配任何时间的一个或多个字符,直到您到达句点字符)
  3. 然后你确定它没有"jar"结尾(?!jar)(这称为负向前看
  4. 最后你抓住了它的结局(.+)

正则表达式很容易搞砸,所以我强烈建议您使用像Regex Buddy这样的工具来帮助您构建它们.它会将正则表达式分解为简单的英语,这确实有帮助.

编辑

Jason S,你抓住了我,它确实错过了那些文件.

此更正的正则表达式适用于您列出的每个示例:

foo/bar/(?!.*\.jar$).+
Run Code Online (Sandbox Code Playgroud)

它发现:

  • 富/酒吧/ baz.txt
  • 富/酒吧/巴兹
  • 富/酒吧/罐
  • 富/酒吧/ baz.jar.txt
  • 富/酒吧/ baz.jar.
  • 富/酒吧/巴兹.
  • 富/酒吧/ baz.txt.

但是找不到

  • 富/酒吧/ baz.jar

新解释

这表示在"foo/bar /"中查找文件,如果有零个或多个字符后跟".jar",然后再没有更多字符($表示行尾),则不匹配,如果不是'在这种情况下,匹配以下任何字符.

  • 这个解决方案对我来说效果很好,但我只想补充说.hgignore文件在使用之前应该有`syntax:regexp`.您可以在文件中稍后恢复为`syntax:glob`. (2认同)