是否有一种方法可以忽略目录中同一类型的所有文件?
**显然对git没有意义,所以这行不通:
**
/public/static/**/*.js
其思想是匹配任意嵌套文件夹。
从未尝试过,但git help ignore建议,如果你在/public/static中放入.gitignore和*.js,它将实现你想要的效果。
git help ignore
/public/static
.gitignore
*.js
注意:一定要看看下面Joeys的回答:如果你想忽略特定子目录中的文件,那么本地的.gitignore是正确的解决方案(局部性很好)。但是,如果您需要将相同的模式应用于整个回购,那么**解决方案会更好。
更新:看看@Joey的回答: Git现在在模式中支持**语法。这两种方法都可以正常工作。
Gitignore(5)手册页声明:
从与路径相同目录的.gitignore文件中读取的模式,或在任何父目录中读取的模式,高级文件中的模式(直到工作树的顶层)将被低级别文件中的模式覆盖,直到包含该文件的目录。
这意味着在repo的任何给定目录中的.gitignore文件中的模式将影响该目录和所有子目录。
您提供的模式
不是很正确,首先是因为(正如你所正确指出的)Git不使用**语法。而且,前导/将该模式锚定到路径名的开头。(所以,/public/static/*.js将匹配/public/static/foo.js但不 /public/static/foo/bar.js.) 删除前导__ABC1也不行,只能匹配像__ABC6和foo/public/static/bar.js这样的路径。编辑:仅仅删除前导斜杠也不行——因为模式仍然包含斜杠,Git将它视为普通的、非递归的shell glob(感谢/0指出这一点)。
/
/public/static/*.js
/public/static/foo.js
/public/static/foo/bar.js
foo/public/static/bar.js
正如@ptyx所建议的,你需要做的是创建文件<repo>/public/static/.gitignore,并只包括以下模式:
<repo>/public/static/.gitignore
没有前导/,所以它将匹配路径的任何部分,并且该模式将只应用于/public/static目录及其子目录中的文件。
要忽略未跟踪的文件,只需转到.git/info/exclude。Exclude是一个包含被忽略扩展名或文件列表的文件。
根据的文档,从1.8.2.1版本开始,git似乎支持**语法。
1.8.2.1
git
在匹配完整路径名的模式中,两个连续的星号("**")可能具有特殊含义: 开头的“**”后面跟一个斜杠表示在所有目录中匹配。为 例如,"**/foo"匹配文件或目录"foo"的任何位置,相同 作为模式“foo”。"**/foo/bar"匹配"bar"文件或目录 .在"foo"目录下的任意位置 A后面的"/**"匹配里面的所有内容。例如,"abc/**" 匹配目录"abc"内的所有文件,相对于 . .gitignore文件,无限深度 一个斜杠后跟两个连续的星号,然后一个斜杠匹配 零或多个目录。例如,"a/**/b"匹配"a/b", "a/x/b", "a/x/y/b"等等。 . 其他连续的星号被认为无效。
在匹配完整路径名的模式中,两个连续的星号("**")可能具有特殊含义:
开头的“**”后面跟一个斜杠表示在所有目录中匹配。为 例如,"**/foo"匹配文件或目录"foo"的任何位置,相同 作为模式“foo”。"**/foo/bar"匹配"bar"文件或目录
**/foo
foo
**/foo/bar
bar
A后面的"/**"匹配里面的所有内容。例如,"abc/**" 匹配目录"abc"内的所有文件,相对于
/**
abc/**
abc
一个斜杠后跟两个连续的星号,然后一个斜杠匹配 零或多个目录。例如,"a/**/b"匹配"a/b", "a/x/b", "a/x/y/b"等等。
a/**/b
a/b
a/x/b
a/x/y/b
其他连续的星号被认为无效。
我相信最简单的解决方案是使用find。我不喜欢在子目录中有多个.gitignore,我更喜欢管理一个唯一的顶级.gitignore。要做到这一点,你只需将找到的文件附加到你的.gitignore。假设/public/static/是你的项目/git的家,我将使用这样的东西:
find
/public/static/
find . -type f -name *.js | cut -c 3- >> .gitignore
我发现在开始的时候去掉./对于git理解要避免哪些文件通常是必要的。因此,cut -c 3-.;
./
cut -c 3-
我已经尝试在我的vscode中打开.gitignore文件,windows 10。在这里,您可以看到一些先前添加的忽略文件(如果有的话)。
windows 10
要创建一个新规则来忽略扩展名为(.js)的文件,可以像这样追加文件的扩展名:
(.js)
这将忽略你的git存储库中的所有.js文件。
.js
要从特定目录中排除特定类型的文件,你可以添加这个:
**/foo/*.js
这将忽略/foo/目录下的所有.js文件。
有关详细的学习,您可以访问:关于git-ignore
在其他答案之上还有一些额外的建议(如果你幸运的话,问题是由其他原因引起的,这些建议可能会起作用):
正如其他答案已经说过的,像**/*.exe这样的模式将忽略存储库中任何地方的所有.exe文件。
**/*.exe
.exe
然而,许多人(像我一样)在排除故障时必然会遇到这个问题…< br > 为什么这不是工作
因此,命令git status或你的IDE可能会告诉你xyz.exe即将被提交,你可能会把头撞到墙上,试图弄清楚为什么会这样,因为你的.gitignore文件中确实有**/*.exe,而且这个问答确认了这实际上是正确的魔法咒语,这应该会阻止这种情况。但事实并非如此。
git status
xyz.exe
你在这种荒谬的情况下的实际原因是你(或者,更有可能是你的IDE自动为你)已经上演了那个文件。
解决方案是首先取消它,然后它将被忽略。
<rant>
</rant>