前言
在使用 git
的时候,经常会碰到某些文件不需要提交到远程,最常见的就是项目中的 node_modules
或者打包出来的压缩包 dist
,这些一般在使用一些框架的时候就会自动帮我们初始化,但是难免会有些情况需要我们自己去添加部分需要忽略的文件。
基础使用
在 git
的文件系统中,文件被分为三类,分别是 Tracked (追踪文件), Untracked (未追踪文件), Ignored(忽略文件)。
忽略文件是必须要由我们来告诉 git
哪些文件需要被忽略
而 .gitignore
文件就是我们告诉 git
要忽略哪些的文件的桥梁
你可以用下面的规则在 .gitignore
文件中描述你想要忽略什么文件
注释
使用 #
开头来进行注释,可以为你的忽略文件进行一些解释
比方说
bash
# this is .gitignore file.
通过目录忽略
可以在里面写下某个目录的名称,比如说
bash
folderName
或者
bash
folderName/
这两种写法是一样的,这样 git
就会忽略 folderName
底下的所有文件
这种写法会指定项目中所有的 folderName
你可以通过下面的写法来指定你想要忽略的哪个目录
bash
# 根目录下的 folderName
/folderName
# 第二层 folderName 无论第一层文件夹是什么名字
*/folderName
通过文件忽略
还可以通过某个文件的文件名进行忽略,比方说
bash
fileName.js
这样就可以忽略 fileName.js
这个文件,不论它在哪个目录下
跟上面一样,你也可以通过在前面添加 /
或者 *
来匹配不同层级的文件
bash
# 根目录下的 fileName.js
/fileName.js
# 第二层 fileName.js 无论第一层文件夹是什么名字
*/fileName.js
使用通配符
例如上面的 *
就是通配符的一种,当然还提供了其他的通配符来方便我们进行匹配
常用的通配符有:
- 星号
*
:匹配任意字符;
除了上面的用法,放在目录的某一层级,代表全部,还可以用于拼接部分文件名称,用于匹配多个文件,比如说
bash
*.png
用于匹配所有以 png
为结尾的文件
bash
folder/*/flieName.js
用于跳过 folder
下的第一层目录,直接去第二层查找 flieName.js
- 问号
?
:匹配除 '/'外的任意一个字符;
用法和 *
相同,只不过 ?
只能匹配到一个字符
- 方括号
[xxxx]
:包含单个字符的匹配列表;
用数组的方式匹配多个的单个字符
比方说用 [a,b,c].js
同时可以匹配三个文件 a.js
、b.js
、c.js
[a,b,c].js
与 ['a', 'b', 'c'].js
是等价的,但是要注意单个字符,也就是说 ['aa']
是无效的。
- 感叹号
!
:表示不忽略(跟踪)匹配到的文件或目录;
比如说你忽略了 A
这整个文件夹,但是你不想忽略底下的 B.js
文件,你就可以这样写
bash
A/*
!A/B.js
如何查看自己已忽略的文件
可能你写了一个很复杂的匹配规则,你并不确定它到底忽略了什么,是否是你想要的,这时候,你可以使用 git ls-files --ignore --exclude-standard -o
来查看当前的目录下有哪些被忽略的文件(你的忽略规则匹配到了哪些文件)
bash
git ls-files --ignore --exclude-standard -o

git添加.gitignore后不生效问题
问题现象
可能有一部分文件,你已经正在开发并且提交过 git
了,但是后面发现这部分文件不需要保存到 git
里面去,这时候你在 .gitignore
中添加上这些文件就会发现 .gitignore
失效了。
问题原因
因为我们误解了 .gitignore
文件的用途,该文件只能作用于 Untracked Files
,也就是未追踪文件。
之所以你的规则不生效,是因为那一部分文件已经被 Git 记录过,因此 .gitignore
对它们完全无效。
解决方法
- 在
git
中删除对这些文件的追踪 - 将这一操作推送
bash
git rm -r --cached 'yourFileRoute'
git add .
git commit
yourFileRoute
可以输入一个具体文件的路径,也可以是某个文件夹的路径(这样将会移除这个文件夹下所有文件的追踪)
在你执行了这一操作并且这个路径是合法的以后,你就能够在控制台看到匹配到了多少个文件。

然后选哟将这一操作推送到远程,这之后这个文件就会被合理的忽略了。

总结
本文简单的介绍了一下 .gitignore
文件,以及总结了一些有用的命令或者是问题,希望在看完这一篇文章以后能够对 .gitignore
文件有一个初步的了解,并且让你来配置这个文件也能够做到信手拈来