由于
**
对 Git 来说是无意义的,因此这种方法行不通:/public/static/**/*.js
这个想法是匹配任意嵌套的文件夹。
git
在版本1.8.2.1
中支持**
语法。
完整路径名中的模式匹配中,两个连续的星号("
**
")可能具有特殊含义:
以斜杠开头的 "
**
" 表示匹配所有目录。例如,"**/foo
" 可匹配任意位置的文件或目录 "foo
",与模式 "foo
" 相同。"**/foo/bar
" 匹配直接位于目录 "foo
" 下面的文件或目录 "bar
"。以斜杠结尾的 "
/**
" 表示匹配内部的所有内容。例如,"abc/**
" 可匹配相对于.gitignore
文件所在位置的目录 "abc
" 中的所有文件,包括无限深度。斜杠后紧随两个连续的星号然后是一个斜杠表示匹配零个或多个目录。例如,"
a/**/b
" 可匹配 "a/b
"、"a/x/b
"、"a/x/y/b
" 等。其他连续的星号被视为无效。
xxx/**
和xxx/
有什么区别? 答:xxx/**
表示匹配xxx
目录下的所有子目录和文件,而xxx/
仅匹配xxx
目录本身。 - Danielxxx/**
匹配 xxx
目录下所有的文件和文件夹,而 xxx/
则只匹配 xxx
目录本身。这一点只有在使用否定模式 !
时才会产生影响,因为“如果一个文件的父目录被排除在外,则无法重新包含该文件。”,所以在这种情况下必须使用 xxx/*
或 xxx/**
。 - joeyhoer**.js
是什么意思? - Black从未尝试过,但是 git help ignore
建议在 /public/static
中放置一个带有 *.js
的 .gitignore
可以实现你想要的效果。
注意:一定要查看下面 Joey's 的答案:如果您想忽略特定子目录中的文件,则本地的 .gitignore 是正确的解决方案(局部性很好)。但是,如果需要将相同的模式应用于整个存储库,则 ** 解决方案更好。
更新:请看@Joey的答案:Git现在支持模式中**
语法。这两种方法都应该可以正常工作。
gitignore(5)手册中指出:
从与路径相同的目录中读取模式,或从任何父目录中读取.gitignore文件,并且高层级文件(直到工作树的顶层)中的模式将被低层级文件中的模式覆盖,直到包含该文件的目录为止。
这意味着在您的repo中给定目录中的.gitignore
文件中的模式将影响该目录和所有子目录。
您提供的模式为
/public/static/**/*.js
**
语法,因此该模式不正确。其次,前导的/
将该模式锚定到路径名的开头。(因此,/public/static/*.js
将匹配/public/static/foo.js
但不会匹配/public/static/foo/bar.js
。)去掉前导的/
也不行,它会匹配像public/static/foo.js
和foo/public/static/bar.js
这样的路径。编辑:仅删除前导斜杠也行不通——因为模式仍然包含一个斜杠,Git将其视为普通的非递归shell glob(感谢@Joey Hoer指出这一点)。<repo>/public/static/.gitignore
并仅包括此模式。*.js
没有前导/
,因此它将匹配路径的任何部分,并且该模式仅适用于/public/static
目录及其子目录中的文件。
/
也行不通,匹配路径如public/static/foo.js
和foo/public/static/bar.js
。”是错误的。引用文档:“如果模式不包含斜杠/,Git将其视为shell glob模式,并针对相对于.gitignore文件位置的路径名进行匹配(如果不是来自.gitignore文件,则相对于工作树的顶级)。” foo/public/static/bar.js
不会被匹配,因为该模式包含/
。 - joeyhoer我已经尝试在我的VSCode,Windows 10中打开.gitignore文件。在那里,您可以查看之前添加的忽略文件(如果有的话)。
要创建一个新规则以忽略扩展名为(.js)
的文件,请像这样追加文件的扩展名:
*.js
这将忽略您的git
仓库中所有.js
文件。
要从特定目录中排除某种类型的文件,您可以添加以下内容:
**/foo/*.js
这将忽略仅在 /foo/ 目录内的所有 .js 文件。
要了解更详细的内容,您可以访问:关于git-ignore
要忽略未跟踪的文件,只需前往.git/info/exclude。Exclude是一个包含被忽略的扩展名或文件列表的文件。
**/*.exe
的模式将忽略存储库中任何位置的所有 .exe
文件。git status
或你的 IDE 可能会告诉你要提交 xyz.exe
,你可能正在努力想弄清楚为什么会出现这种情况,因为你的 .gitignore 文件确实有**/*.exe
,并且此问答证实这确实是正确的魔法咒语,应该防止这种情况。但是它没有起作用。我认为最简单的解决方案是使用 find
命令。我不喜欢在子目录中放置多个 .gitignore
文件,而且我更喜欢管理一个唯一的顶级 .gitignore
文件。为此,您可以将找到的文件追加到您的 .gitignore
文件中。假设 /public/static/
是您的项目/git主目录,我会使用类似以下命令:
find . -type f -name *.js | cut -c 3- >> .gitignore
我发现在git理解要避免哪些文件时,通常需要删除开头的./
。因此使用cut -c 3-
命令。
我使用了git rm --cached **.DS_Store
命令从代码库中删除并取消跟踪所有的.DS_Store
文件。
除了其他答案提到的一些方法(如果你运气好,问题是由于其他原因引起的可能有效)外,以下是一些额外的建议: