项目中经常会有很多临时文件, 如临时的编译中间文件, 通常这些文件不需要加入到版本控制中. 如何在提交的时候跳过这些文件? 一种办法是很繁琐的在 git add 的时候手动添加需要加入版本控制的文件, 这种方法不仅繁琐也很容易犯错.还有一个办法就是使用 gitignore 文件.
什么是 gitignore 文件
gitignore 文件是一个普通的文本文件, 使用一定的语法过滤不需要版本控制的文件/ 文件夹 .
gitignore 文件放在何处
通常, 有三个位置存放 gitignore 文件
全局配置
全局配置负责屏蔽掉所有项目都需要过滤的文件, 如
Thumbs.db
, .DS_Store
具体位置在可以通过运行命令 git config core.excludesfile
查看
全局配置只会影响你自己
私有配置
位置在项目根目录下的 .git/info/exclude
, 这个文件只会你影响你自己, 不会影响其他人, 也不会传到版本控制中. 可以用来过滤一些你自己私有的文件, 比如你自己用的测试数据等
.gitignore
这个文件可以有很多个, 文件名为 .gitignore
, 通常只有一个并且放在项目根目录内
如果你爱折腾, 也可以创建很多这个文件, 放在子目录里面
这个文件会加入到版本控制中, 也会作用于本仓库的其他用户
多个 gitignore 文件之间的优先级
首先 .gitignore 文件优先级最高
其次是你的私有配置
再然后是全局配置
如果你爱折腾, 有很多个. gitignore 文件在不同文件夹里面
那么不同 .gitignore 文件之间是就近原则
例如, 在某个文件夹下 A 下面, 有很多文件 .test 后缀文件
根目录下的 .gitignore 屏蔽了所有后缀名为 .test 的文件
但是对于这个文件夹下面的这些文件需要加入版本控制, 你有不想或者没有权限去修改根目录下面的 .gitignore 来添加例外规则
这个时候, 你就可以在 A 文件夹下面, 自行创建一个 .gitignore 来添加例外把这些文件加入到版本控制中.
哪些文件需要放入 gitignore 里
通常, 能够通过其他文件自动生成的都不需要放入版本控制, 如编译产生的临时文件.
还有, 操作系统会创建自动创建一些文件, 如缩略图, 这些也不需要放入版本控制
最后, 某些比较敏感的文件, 比如包含数据库连接密码的配置文件也不要放到公共 git 仓库里
不过, 并不是一定如此, 还是得具体问题具体分析
我怎么判断哪些规则该写入那个 gitignore 文件
如果某个规则是需要共享给同一仓库下其他用户的, 比如过滤产生的编译文件, 那么就写入 .gitignore 中
如果某一个规则只需要针对一个特定的仓库, 但是你不需要共享给其他用户, 比如你自己用的测试数据, 那就放入私有配置中
如果你想某个柜子在所有仓库下都能过滤指定的文件, 如 Mac 下的 .DS_Store
文件, 那么就写入到全局配置文件里面
我该如何编写 gitignore 文件
gitignore文件中, 一行对应一条规则
- 空行被自动忽略, 可以随便插入若干行空行, 你可以作为不同类型规则的分割线
- 以
#
开头的规则被认为是注释, 会被自动忽略. 如果你想过滤一个 以#
开头的文件, 可以在#
之前加一个 反斜杠\\
, 如
# 这是注释, 下面一条规则会过滤 #.txt 这个文件
\#.txt
- 会自动去除规则前后的空格, 如果你想要过滤文件名中头尾含有空格的文件, 用 反斜杠
\\
将规则包裹起来, 如
# 过滤" 123.txt" 这个文件
\ 123.txt\
-
!
开头的规则表示例外规则,会将符合规则的文件重新加入版本控制中. 不过如果某文件的某个祖先文件夹被过滤了, 是不可能通过单独写一条例外规则来让这个文件重新加入版本控制中的. 如果需要过滤一个以 感叹号开头的文件, 需要在!
之前加上一个反斜杠\\
, 如
# 过滤所有后缀为 .a 的文件
*.a
# 但是保留 privatelib.a 文件
!privatelib.a
# 过滤 build 文件夹
build/
# 下面这句是无意义的, 因为父文件夹已经被过滤了
!build/a.class
# 过滤 "!.txt" 文件
\!.txt
- 如果规则以斜杠
/
结尾, 代表过滤掉这个文件夹及其所有子文件及子文件夹, 如
# 过滤 build 文件夹及下面所有的文件和文件夹
build/
- 普通规则, 如
# 过滤文件名为 test.txt 的文件
test.txt
# 过滤所有 .a 结尾的文件
*.a
# 过滤文件名只有一个字符的txt 文件
?.txt
# 过滤 testa.txt, testb.txt
test[ab].txt
# 过滤 testc.txt 到 testz.txt
test[c-z].txt
# 仅仅过滤项目根目录下的 TODO 文件,不包括 /A/TODO
/TODO
# 过滤 doc/notes.txt 但不包括 doc/server/notes.txt.
# 相对路径以当前的 .gitignore 文件为起点,
# 如果是 私有配置 或是 全局配置, 则以项目根目录为起点
doc/notes.txt
# 过滤 package 目录下所有的 readme.md文件
package/**/readme.md
语法这么麻烦, 有没有现成的
如果你像我一样懒, 你可以在github 提供的常用 gitignore 文件 去找找.
你只需下载你需要的文件, 然后重命名为.gitignore 放到你项目根目录里面就行
我该在什么时候编写 gitignore 文件
gitignore 对已经提交的文件没有作用, 也就是说, 你不能编写一个规则去过滤对某一个已经加入版本控制的文件
所以你应该一开始就写 gitignore, 如果是 .gitignore, 记得在第一时间提交上去
如何添加强行将某一个被忽略的文件加入版本控制中而不用修改任何现存的 gitignore
如果只有一两个被过滤的文件想要加入版本控制中, 而你又嫌弃修改 gitignore 复杂而麻烦, 你可以使用 git add -f mainlib.a
加入版本控制
总结
- gitignore 是用来过滤不想加入版本控制的文件用的
- 可以找到很多现成的 gitignore 文件
- 你应该尽早编写gitignore并及时提交
参考资料
git 官方文档: https://git-scm.com/docs/gitignore
segmentfault https://segmentfault.com/a/1190000000522997
廖雪峰的博客 : http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758404317281e54b6f5375640abbb11e67be4cd49e0000
网友评论