收集所有 Ignore 文件的用法
简介
主要收集一些 ignore 文件的用法与配置,当前包括 gitignore
, dockerignore
, npmignore
目录
gitignore
在 git
项目中添加 .gitignore
表示忽略这个文件夹中的某些文件或文件夹,一行一条规则。
比如我的全局 gitignore
是这么配置的
*~
.DS_Store
.idea
解释:
- 第一行 : 意思是忽略所有以
~
开头的文件或文件夹 - 第二行 : 忽略
.DS_Store
这个文件夹,因为 Mac 打开文件夹会自动生成这个文件夹,对于项目没有作用 - 第三行 : 忽略
.idea
这个文件夹, 由于我的主编辑器是.idea
, 而其它同事.idea
配置很可能和我不同,忽略之以减少不必要的冲突。且对项目没有作用。
定义全局的 .gitignore
文件,所有项目都共用这个配置
在你喜欢的目录创建一个文件,里面放你需要忽略的条目,如我上面的示例。
cat <<EOF > ~/.gitignore_global
*~
.DS_Store
.idea
EOF
当然 .gitignore_global
你可以改成任意名字
配置 git
$ git config --global core.excludesfile ~/.gitignore_global
或者 git config --global -e
把下面配置追加到配置中。
[core]
excludesfile = ~/.gitignore_global # 这个路径为你写好的全局 `.gitignore` 文件位置
忽略规则
.gitignore
可以忽略来自多个位置提供的配置文件,上面就说到了两种,发下是所有位置
并且优先级由高到低排列。
- 从命令行中读取可用的忽略规则
- 当前目录定义的规则
- 父级目录定义的规则,依次递推
- $GIT_DIR/info/exclude 文件中定义的规则
- core.excludesfile中定义的全局规则
Git
忽略规则匹配语法
- 空格不匹配任意文件,可作为分隔符,可用反斜杠转义
-
开头的文件标识注释,可以使用反斜杠进行转义
- ! 开头的模式标识否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用 ! 也不会再次被包含。可以使用反斜杠进行转义
- / 结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件
- / 开始的模式匹配项目跟目录
- 如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录
- ** 匹配多级目录,可在开始,中间,结束
- ? 通用匹配单个字符
- [] 通用匹配单个字符列表
举点例子
bin/
: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件/bin
: 忽略根目录下的bin文件/*.c
: 忽略 cat.c,不忽略 build/cat.cdebug/*.obj
: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj**/foo
: 忽略/foo, a/foo, a/b/foo等a/**/b
: 忽略a/b, a/x/b, a/x/y/b等!/bin/run.sh
: 不忽略 bin 目录下的 run.sh 文件*.log
: 忽略所有 .log 文件config.php
: 忽略当前路径的 config.php 文件
不生效的 .gitignore
.gitignore
只能忽略那些原来没有被跟踪的文件,如果某些文件已经被纳入了版本管理中,则修改 .gitignore
是无效的。
解决方法就是先把本地缓存删除(改变成未跟踪状态),然后再提交:
$ git rm -r --cached .
$ git add .
$ git commit -m 'update .gitignore'
dockerignore
简介
在 docker CLI
将上下文发送到docker守护程序之前,它会在上下文的根目录中查找名为 .dockerignore
的文件。如果此文件存在,CLI 将修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免不必要地将大型或敏感文件和目录发送到守护程序,并可能使用 ADD
或 COPY
将它们添加到映像。
举个例子
# comment
*/temp*
*/*/temp*
temp?
以上配置导致以下构建行为:
# comment
: 注释,忽略*/temp*
: 在根目录的所有子目录,排除所有以temp
文件开头的文件和目录
例如,排除普通文件/somedir/temporary.txt
,目录/somedir/temp
也是如此。*/*/temp*
: 排除根目录下的二级目录以temp
开头的文件
例如,排除了/somedir/subdir/temporary.txt
。temp?
: 排除根目录以temp
打头的,?
表示之后的一个字符随意, 例如,排除/tempa
和/tempb
具体排除规则
**
: 表示匹配任意数量的目录, 例如**/*.go
表示排除所有目录下以.go
结尾的文件!
: 表示在此条规则之上的规则中,忽略此条规则所匹配的内容。
*.md
!README.md
表示排除所有以 .md
结尾的文件,但不包括 README.md
这个文件。
npmignore
简介
当你有需要提交的 npm
包时,你可能会用到这个配置。你可以控制哪些文件不要随着一起提交。
如果你的文件没有 .npmignore
, 那么将忽略 .gitignore
文件匹配的文件和目录,如果你想提交一些被 .gitignore
排除的文件,那么你可以新建一个空 .npmignore
文件,或把你需要排除的写在里面。
匹配模式
.npmignore
的匹配模式与 .gitignore
的匹配模式相同。
空行或以 #
开头的文件将被忽略。
默认情况下,将忽略以下路径和文件,因此无需将它们显式添加到 .npmignore
- .*.swp
- ._*
- .DS_Store
- .git
- .hg
- .npmrc
- .lock-wscript
- .svn
- .wafpickle-*
- config.gypi
- CVS
- npm-debug.log
此外,除了捆绑的依赖项之外,node_modules中的所有内容都将被忽略。
以下路径和文件永远不会被忽略,因此将它们添加到 .npmignore
是没有意义的:
- package.json
- README (and its variants)
- CHANGELOG (and its variants)
- LICENSE / LICENCE
小结
本文主要收集各种我接触到的 ignore
文件的用法与配置规则,权当笔记使用。