#docker #git #npm #ignore

收集所有 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.c
  • debug/*.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 将修改上下文以排除与其中的模式匹配的文件和目录。这有助于避免不必要地将大型或敏感文件和目录发送到守护程序,并可能使用 ADDCOPY 将它们添加到映像。

举个例子

# 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 文件的用法与配置规则,权当笔记使用。

Author Mo 最后更新: 2018-12-13 00:17:50