.gitignore文件作用

.gitignore文件是用来忽略指定的文件或文件夹,被记录在.gitignore中的文件或文件夹是不会被git追踪到的。意思就是:在.gitignore中记录的文件或文件夹不会提交到git远程仓库中。

.gitignore文件存放地址

.gitignore文件放在git仓库的根目录下(与.git文件同级)
image.png

.gitignore文件语法

  1. .gitignore 文件中,每一行的忽略规则的语法如下:
  2. 1、空格不匹配任意文件,可作为分隔符,可用反斜杠转义
  3. 2、以“#”开头的行都会被 Git 忽略。即#开头的文件标识注释,可以使用反斜杠进行转义。
  4. 3、可以使用标准的glob模式匹配。所谓的glob模式是指shell所使用的简化了的正则表达式。
  5. 4、以斜杠"/"开头表示目录;"/"结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件;"/"开始的模式匹配项目跟目录;如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录。
  6. 5、以星号"*"通配多个字符,即匹配多个任意字符;使用两个星号"**" 表示匹配任意中间目录,比如a/**/z可以匹配 a/z, a/b/z a/b/c/z等。
  7. 6、以问号"?"通配单个字符,即匹配一个任意字符;
  8. 7、以方括号"[]"包含单个字符的匹配列表,即匹配任何一个列在方括号中的字符。比如[abc]表示要么匹配一个a,要么匹配一个b,要么匹配一个c;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配。比如[0-9]表示匹配所有09的数字,[a-z]表示匹配任意的小写字母)。
  9. 8、以叹号"!"表示不忽略(跟踪)匹配到的文件或目录,即要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。需要特别注意的是:如果文件的父目录已经被前面的规则排除掉了,那么对这个文件用"!"规则是不起作用的。也就是说"!"开头的模式表示否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用"!"也不会再次被包含。可以使用反斜杠进行转义。

例:

  1. *.a # 忽略所有 .a 结尾的文件
  2. !lib.a # 但 lib.a 除外
  3. /dest # 仅仅忽略项目根目录下的 dest 文件,不包括 src/dest
  4. build/ # 忽略 build/ 目录下的所有文件
  5. doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
  6. bin/: 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
  7. /bin: 表示忽略根目录下的bin文件
  8. /*.c: 表示忽略cat.c,不忽略 build/cat.c
  9. debug/*.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
  10. **/foo: 表示忽略/foo,a/foo,a/b/foo
  11. a/**/b: 表示忽略a/b, a/x/b,a/x/y/b
  12. *.log: 表示忽略所有 .log 文件
  13. config.php: 表示忽略当前路径的 config.php 文件
  14. fd1/* 忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;
  15. /fd1/* 忽略根目录下的 /fd1/ 目录的全部内容;
  16. /mtk/* 忽略根目录下的/fd1/ 目录的全部内容
  17. !/mtk/one.txt 不忽略mtk目录下的 one.txt文件

.gitignore不生效

.gitignore只能忽略原来没有被跟踪的文件,跟踪过的文件是无法被忽略的。就是git远程仓库中存在的文件,我们在.gitignore文件中再写上也是不生效的。
解决方法就是先把本地缓存删除(改变成未跟踪状态),然后再提交:

  1. git rm -r --cached .
  2. git add .
  3. git commit -m "update .gitignore"

注意点

git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;
注意写法 要忽略的文件夹一定要结尾 /* ,否则不忽略规则将无法生效