有没有办法忽略目录中某个类型的所有文件?
**
显然对 git 毫无意义,所以这不起作用:
/public/static/**/*.js
这个想法是匹配任意嵌套文件夹。
根据文档,该语法似乎**
受自git
版本支持。1.8.2.1
**
与完整路径名匹配的模式中的两个连续星号 (" ") 可能具有特殊含义:
前导“
**
”后跟斜杠表示在所有目录中都匹配。例如,“ ”在任何地方**/foo
匹配文件或目录“foo
”,与模式“foo
”相同。"**/foo/bar
" 匹配文件或目录 "bar
" 直接在目录 "foo
" 下的任何地方。尾随的 "
/**
" 匹配里面的所有内容。例如,“abc/**
”匹配目录“abc
”内的所有文件,相对于.gitignore
文件的位置,具有无限深度。斜杠后跟两个连续的星号,然后斜杠匹配零个或多个目录。例如,“
a/**/b
”匹配“a/b
”、“a/x/b
”、“a/x/y/b
”等。其他连续的星号被认为是无效的。
从未尝试过,但git help ignore
建议如果你放一个.gitignore
with *.js
in /public/static
,它会做你想做的事。
注意:请务必在下面查看 Joeys 的回答:如果您想忽略特定子目录中的文件,那么本地 .gitignore 是正确的解决方案(本地性很好)。但是,如果您需要将相同的模式应用于整个 repo,那么 ** 解决方案会更好。
更新:看看@Joey 的回答:Git 现在支持**
模式中的语法。两种方法都应该可以正常工作。
gitignore (5) 手册页指出:
从与路径相同的目录或任何父目录中的 .gitignore 文件读取的模式,较高级别文件(直到工作树的顶层)中的模式被低级别文件中的模式覆盖到目录包含文件。
这意味着.gitignore
您的仓库的任何给定目录中的文件中的模式都会影响该目录和所有子目录。
您提供的模式
/public/static/**/*.js
不太正确,首先是因为(正如您正确指出的)**
Git 不使用该语法。此外,该模式的前导/
锚定到路径名的开头。(因此,/public/static/*.js
将匹配/public/static/foo.js
但不 /public/static/foo/bar.js
匹配。)删除前导编辑:仅仅删除前导斜杠也不起作用——因为该模式仍然包含一个斜杠,它被 Git 视为一个普通的、非递归的 shell glob(感谢@Joey Hoer指出这一点)。/
也不起作用,匹配路径如public/static/foo.js
和foo/public/static/bar.js
。
正如@ptyx 建议的那样,您需要做的是创建文件<repo>/public/static/.gitignore
并仅包含以下模式:
*.js
没有前导/
,因此它将匹配路径的任何部分,并且该模式只会应用于/public/static
目录及其子目录中的文件。
我尝试.gitignore
在我的 vscode 中打开文件,windows 10
. 在那里你可以看到,一些以前添加的忽略文件(如果有的话)。
要创建一个新规则以忽略具有(.js)
扩展名的文件,请附加文件的扩展名,如下所示:
*.js
这将忽略存储库.js
中的所有文件。git
要从特定目录中排除某些类型的文件,您可以添加以下内容:
**/foo/*.js
这将忽略仅 /foo/ 目录中的所有 .js 文件。
详细学习可以访问:about git-ignore
要忽略未跟踪的文件,只需转到 .git/info/exclude。排除是具有忽略扩展名或文件列表的文件。
我相信最简单的解决方案是使用find
. 我不喜欢.gitignore
在子目录中有多个闲逛,我更喜欢管理一个独特的顶级.gitignore
. 为此,您只需将找到的文件附加到您的.gitignore
. 假设那/public/static/
是你的项目/git home,我会使用类似的东西:
find . -type f -name *.js | cut -c 3- >> .gitignore
我发现删除./
开头的 git 通常需要了解哪些文件要避免。因此cut -c 3-
.
除了其他答案之外,几乎没有其他提示(如果您很幸运并且问题是由于其他原因引起的,这可能会起作用):