Gitignore 所有不匹配的特定模式

Gitignore all non-matching a particular pattern

我试图在我的 .gitignore 中使用以下内容但无济于事(无论 ! 如何,文件都被忽略):

*
!(CODE_OF_CONDUCT|CONTRIBUTING|README).md
!.(editorconfig|github|gitignore|prettierrc|versionrc|vscode)
!(docs|example|LICENSE|src)
!(package|package-lock|(tsconfig.*)).json

有什么方法可以使上述工作正常进行吗?也就是说,匹配和排除除与描述的模式一致的所有内容。

我相信 .gitignore 使用文件名 glob,而不是正则表达式(afaik 也不 extended globbing)。因此,括号、'pipe symbol' (|) 等没有特殊含义,被解释为文件名的一部分。

不幸的是,我认为没有任何方法可以在模式中表达 or。您需要按照以下方式做一些事情(我没有包括所有原始文件):

*
!CODE_OF_CONDUCT.md
!CONTRIBUTING.md
!README.md
!.editorconfig
!.github
!.gitignore
!tsconfig.*.json

如果适用,您可以按常用名称部分对一些文件进行分组,例如

!.git*

或他们的扩展名,例如

!*.md

and/or 将模式限制为大写文件名

![ABCDEFGHIJKLMNOPQRSTUVWXYZ]*.md

(注意这与[A-Z]*不同,因为标准的glob排序AaBbCc等,所以后者表示除了小写z之外的所有大小写字符) .

您也可以 'group' 按子目录,但这似乎不适用于您的情况。

https://git-scm.com/docs/gitignore


编辑:一种间接的方式来做你想做的事情,在你生成文件时使用更紧凑的语法(感谢@jthill):

printf %s\n \!{package,package-lock,tsconfig.*}.json >>.gitignore 

但是,这不会缩短生成的文件。