【问题标题】:.hgignore 'target' folder with some exceptions.hgignore 'target' 文件夹,但有一些例外
【发布时间】:2014-04-26 03:36:25
【问题描述】:

我使用 Mercurial 并为我的项目使用标准 Maven 布局,其中包含多个子模块,例如:

submodule1/src/main/java/xyz/.../
submodule1/src/main/java/xyz/.../target/Target.java
submodule1/src/test/java/xyz/.../target/TargetTest.java
submodule1/target/classes/xyz/.../target/Target.class
submodule1/target/something_else...
submodule2/...
etc...

要从 SCM 中排除所有 target 文件夹,除非 targetsrc 下,例如 submodule1/src/main/java/xyz/.../target/Target.java,我尝试了以下 .hgignores:

syntax: regexp
^(?!(/src/).)/target$

(如果有文件夹名为src,则不匹配,但如果有target 文件夹,则匹配)

syntax: regexp
^[^/]*/(?!(/src/).)*[^/]*/target$

(某些文件夹,如果任何文件夹命名为src,则不匹配,然后是其他一些文件夹,然后是target 文件夹)。

但是这两个.hgignores 都不起作用,submodule1/src/main/java/xyz/.../target 文件夹以及其他target 文件夹仍然被排除在外。

以前,我通过仅忽略直接位于子模块文件夹中的target 来解决此问题,例如

syntax: regexp
^submodule1/target$

但是子模块太多,每次添加子模块时都需要编辑.hgignore

我从.hgignore file is not ignoring the maven target/site directoryhgignore: help ignoring all files but certain ones 得到了关于正则表达式语法的想法。

附:我知道我可以hg add.hgignore 排除的文件,我已经做到了。但这是临时措施。

【问题讨论】:

  • 旁注:我发现了为什么我的正则表达式没有效果。我的.hgignore 的某处显然有syntax: glob */target/**。如果没有该行,它们将允许 target 文件夹中的任何内容,这也是不正确的。

标签: java regex mercurial hgignore


【解决方案1】:

这是一种方式。它只识别不是 /src/ 子目录的 /target/

 # "^(?=.*/target/)(?!(?:(?!/src/|/target/).)*/src/.*(?<=/)target/)"

 ^                                  # BOS
 (?= .* /target/ )                  # Contains /target/, 
 (?!                                # But, does not contain /src/ .. /target/
      (?:
           (?! /src/ | /target/ )
           . 
      )*
      /src/ .* (?<= / ) target/
 )

【讨论】:

  • 非常感谢!我缩短了一些正则表达式,将非捕获的(?:) 替换为普通的()。这样看起来不那么可怕^(?=.*/target/)(?!((?!/src/|/target/).)*/src/.*(?&lt;=/)target/) :-)
猜你喜欢
  • 2023-03-29
  • 2014-04-24
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2017-09-22
  • 1970-01-01
  • 2019-10-04
  • 2020-04-27
相关资源
最近更新 更多