我使用空的.hg_keep
文件在Mercurial中保留一些(否则为空)文件夹。
问题在于我找不到除.hg_keep
个文件之外的所有内容的正则函数。
假设我们有这个文件结构:
a/b/c2/.hg_keep
a/b/c/d/.hg_keep
a/b/c/d/file1
a/b/c/d2/.hg_keep
a/b/.hg_keep
a/b/file2
a/b/file1
a/.hg_keep
a/file2
a/file1
我希望仅在.hg_keep
下保留a/b/
个文件。
在http://gskinner.com/RegExr/的帮助下,我创建了以下.hgignore
:
syntax: regexp
.*b.*/(?!.*\.hg_keep)
但Mercurial会忽略.hg_keep
子文件夹中的所有b
个文件。
# hg status
? .hgignore
? a/.hg_keep
? a/b/.hg_keep
? a/file1
? a/file
# hg status -i
I a/b/c/d/.hg_keep
I a/b/c/d/file1
I a/b/c/d2/.hg_keep
I a/b/c2/.hg_keep
I a/b/file1
I a/b/file2
我知道我可以hd add
所有.hg_keep
个文件,但是有一个带有正则表达式(或glob)的解决方案吗?
答案 0 :(得分:3)
Regexp否定可能对此有用。如果您想忽略除 a/b/.hg_keep
文件之外的所有内容,您可以使用:
^(?!a/b/\.hg_keep)$
这个正则表达式的部分重要是:
^ anchor the match to the beginning of the file path
(?! ... ) negation of the expression between '!' and ')'
a/b/\.hg_keep the full path of the file you want to match
$ anchor the match to the end of the file path
正则表达式
^a/b/\.hg_keep$
仅匹配 名为a/b/.hg_keep
的文件。
否定
^(?!a/b/\.hg_keep)$
将匹配其他所有内容。
答案 1 :(得分:1)
不太确定您在使用正则表达式的上下文中应该是这样,这匹配所有以.hg_keep
结尾的行:
^.*\.hg_keep$
编辑:以下是正则表达式,用于匹配与上述表达式不匹配的项目:
^(?:(?!.*\.hg_keep).)*$
答案 2 :(得分:0)
尝试(?!.*/\.hg_keep$)
。
答案 3 :(得分:0)
寻找类似的东西。 找到了答案,但这不是我们想听到的。
- 限制
醇>没有简单的方法可以忽略除一组文件之外的所有文件。与其他模式结合使用时,尝试使用反向正则表达式匹配将失败。这是一个故意的限制,因为替代格式都被认为太可能混淆用户值得额外的灵活性。