如何将不带点的文件(所有无扩展名的文件)添加到gitignore文件?


110

就像标题所说,是否可以在gitignore文件中添加“其中没有点的文件”?

我想这会处理所有那些麻烦的无扩展名文件。


2
有一些扩展名的文件,您不想忽视:READMELICENSECOPYINGINSTALLMakefile等等,虽然你总是可以强制添加它们,然后他们被跟踪
的JakubNarębski

@JakubNarębski好点。我将其包含在我的答案中以提高可见性。
VonC

Answers:


120

您可以尝试类似的组合:

*
!/**/
!*.*

gitignore排除规则否定的模式)应忽略所有文件(带有扩展名的文件除外)。

如前所述下面通过疯狂的物理学家,规则是:

如果排除了该文件的父目录,则无法重新包含该文件。*
*:除非git 2.中满足某些条件?? +,请参见下文)

这就是为什么!/**/要对文件进行白名单的重要性(将父文件夹递归地白名单)的原因。

我在类似的情况下提到了相同的规则:


正如JakubNarębski 所说,您可能不想忽略所有无扩展名的文件。

我的建议:

  • 首先添加重要的无扩展名文件
  • 然后.gitignore如上所示编辑您的文件:已经版本化的文件将不会被忽略(即使它们没有扩展名)。所有其他的将被忽略。

对于将来要版本的任何无扩展名文件:

git add -f -- myFile

请注意,使用git 2.9.x / 2.10(2016年中吗?),如果重新包含的路径中没有通配符,则如果排除了该文件的父目录,则可以重新包含该文件。

NguyễnTháiNgọcDuy(pclouds试图添加此功能:

但是,由于重新包含的规则之一是:

重新包含规则中的目录部分必须为原义(即没有通配符)

无论如何,这在这里是行不通的。


1
答案是完全正确的。但也许更好的.gitignore**!**.*。我知道如果将星号放在前面不会有什么区别,但是对于贝壳处理通配符的方式来说,它会更明确,更合理...
Willem Van Onsem 2015年

7
注意:要使用其他排除规则,这将是您的.gitignore文件中的第一组规则
Erik

您还可以重新添加某些无扩展名的文件,例如使用!Makefile。当心我在Git 1.7.1中使用此解决方案遇到了问题,而在1.9.0中运行良好。在我的情况下,在根目录中添加文件效果很好,但是在子目录中添加带有扩展名的文件显示为已忽略。这似乎是因为1.7.1尚不支持该**模式,请参见此处
mxmlnkn

1
**被添加到Git中1.8.2。使用!*/代替有什么缺点!/**/吗?
mxmlnkn

@TamaMcGlinn看起来像一个正则表达式:gitignore不支持正则表达式。
VonC

50
*
!*/
!*.*

* 告诉git忽略一切。

!*/然后忽略任何目录。这很关键。

!*.* 取消所有带有扩展名的文件。

如果没有该!*/规则,则.不会列出名称中不带a的目录,并且不会在根文件夹之外添加任何所需文件。

作为参考,请阅读.gitignore文档中的这两个部分:

可选的前缀“!” 否定了模式;先前模式排除的所有匹配文件将再次包含在内。如果排除了该文件的父目录,则无法重新包含该文件。由于性能原因,Git不会列出被排除的目录,因此包含在文件上的任何模式无论在何处定义都无效。在第一个“!”前面加上反斜杠(“ \”)。以文字“!”开头的模式,例如“!important!.txt”。

如果该模式以斜杠结尾,则出于以下描述的目的将其删除,但它只会找到与目录匹配的内容。换句话说,foo /将匹配目录foo及其下的路径,但不匹配常规文件或符号链接foo(这与pathspec通常在Git中的工作方式一致)。


1
接得好。+1。我忘了用我最近在我的其他答案中使用的规则来更新答案。我已经相应更新了我的答案。
VonC

0

在我的文件夹中,有很多带有*.c, *.h, *.txt, *.csv等扩展名的文件和没有任何扩展名的二进制文件。因此,我需要忽略所有文件execpt *.c,*.h.gitignore,因此对我而言,这对于.gitignore示例而言有效:

 */*         #ignore all files in each directory
 !*/*.c      #unignore .c files in each directory
 !*/*.h      #unignore .h header files in each directory
 !.gitignore #unignore .gitignore
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.