发现很多文章对git忽略文件的方式介绍都不全面,我就自己总结一下。最重要的是第三种。
.gitignore
这是耳熟能详,使用最广泛的方式。但仅仅对还未跟踪的文件有效,如果该文件已经被跟踪,规则将不会生效。
.gitignore 的修改是需要提交到仓库的,毕竟是整个项目的忽略规则。
一些常用的gitignore匹配规则
通配符模式:
*.log
- 忽略所有扩展名为 .log的文件。
temp/
- 忽略名为temp的目录及其所有内容。
否定模式:
!important.log
- 忽略所有.log文件,但important.log例外。
具体文件忽略:
config.json
- 忽略名为config.json的特定文件。
通过路径忽略文件:
path/to/file.txt
- 忽略位于特定路径的文件path/to/file.txt。
忽略目录中的所有文件:
dir/*
- 忽略dir目录中的所有文件,但不忽略该目录本身。
递归忽略:
**/temp
- 忽略在任何层级的目录结构中的名为temp的所有目录。
注释: 以# 开头的行被视为注释并被忽略
例如我对一个项目添加了忽略所有js文件的规则,
而demo.js作为新创建文件因为没有被跟踪(没有add,没有commit),所以被忽略了,而之前就已经提交过的文件则不会被gitignore影响,毕竟已经跟踪了还怎么忽略。(爱过的人是无论如何也没办法忽略的)
如果我想忽略已经跟踪的文件,有什么办法呢?
取消跟踪文件
git rm --cached 熟悉linux命令已经看出来这个就是个删除命令。
而参数--cached的意思为不删除本地文件。
需要注意的是,该命令仅仅支持已经被git跟踪的文件(没被跟踪肯定不能操作)
同时该命令也会引起提交,通知该仓库的其他参与者已经删除该文件了。
--cache 参数的唯一区别就是index.js文件还在本地,而README.md 文件已经进入回收站了。
那么有没有对已跟踪的文件,不触发变化但依然可以忽略的命令呢?
有的,兄弟有的。
忽略已被跟踪文件的修改
git update-index --assume-unchanged <file>
该命令的作用是告诉git假定这个文件是没有变化的,所以更改该文件也就不会触发提交。
该假定状态可以通过git update-index --no-assume-unchanged <file>的方式继续对文件进行跟踪,否则你的所有修改都会被git忽略。
如果该文件被其他参与者修改后被你pull了那么就会重新被跟踪。
可以在bash用
git ls-files -v | grep '^[a-z]'
命令查看所有被--assume-unchanged的文件。
后记
日常开发中如果想要忽略某个文件夹或文件夹下的文件就用.gitignore。如果我想要修改一些环境配置,就会使用--assume-unchanged;毕竟是我自己用的,也不用担心每次提交会不小心把修改提交上去。