Git忽略文件的三种方式,最重要的是第三种

77 阅读3分钟

发现很多文章对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文件的规则, image.png

而demo.js作为新创建文件因为没有被跟踪(没有add,没有commit),所以被忽略了,而之前就已经提交过的文件则不会被gitignore影响,毕竟已经跟踪了还怎么忽略。(爱过的人是无论如何也没办法忽略的)

image.png

如果我想忽略已经跟踪的文件,有什么办法呢?

取消跟踪文件

git rm --cached 熟悉linux命令已经看出来这个就是个删除命令。 rm -rf   .gif

而参数--cached的意思为不删除本地文件。

需要注意的是,该命令仅仅支持已经被git跟踪的文件(没被跟踪肯定不能操作)

同时该命令也会引起提交,通知该仓库的其他参与者已经删除该文件了。

image.png --cache 参数的唯一区别就是index.js文件还在本地,而README.md 文件已经进入回收站了。

那么有没有对已跟踪的文件,不触发变化但依然可以忽略的命令呢?

有的,兄弟有的。

忽略已被跟踪文件的修改

git update-index --assume-unchanged <file>

该命令的作用是告诉git假定这个文件是没有变化的,所以更改该文件也就不会触发提交。

image.png

该假定状态可以通过git update-index --no-assume-unchanged <file>的方式继续对文件进行跟踪,否则你的所有修改都会被git忽略。

如果该文件被其他参与者修改后被你pull了那么就会重新被跟踪。

可以在bash用

git ls-files -v | grep '^[a-z]'

命令查看所有被--assume-unchanged的文件。

后记

日常开发中如果想要忽略某个文件夹或文件夹下的文件就用.gitignore。如果我想要修改一些环境配置,就会使用--assume-unchanged;毕竟是我自己用的,也不用担心每次提交会不小心把修改提交上去。