git忽略特定文件(gitignore)

.gitignore语法规则

  • 使用 # 来编写注释,注释的内容不会被git视为忽略规则
  • 忽略规则以/结尾表示忽略的对象是一个目录,而不是文件
  • 忽略规则以/开头则表示忽略的对象的路径是相对于项目的根目录,如果某个规则的开头不是/,那么这条规则的匹配路径会相对于当前.gitignore文件的位置
  • 在忽略规则最开头加上!表示不忽略该规则指定的对象(相当于取反)
  • 可以使用标准glob模式匹配(glob模式就是Linux的shell下简化的正则表达式)

glob模式规则

  • *表示匹配0个或任意多个字符
  • ?表示匹配1个任意的字符
  • []表示匹配方括号中的任意一个字符,例如[abc]要么只匹配一个a,要么只匹配一个b,要么只匹配一个c。还可以使用范围表示,例如[0-9]表示匹配所有的一位数字
  • **表示匹配任意多层的中间目录,例如a/**z可匹配a/c/z,也可匹配a/c/b/z等等

为什么我设置的忽略规则不生效

有朋友可能遇到过这种情况,在自己的某个项目已经做了一段时间后,想忽略一些项目中的文件和目录,中途增加了一个.gitignore文件,但是发现commit后,明明设置了忽略的文件仍然被git提交了。这是因为在这条忽略规则添加之前,git就已经跟踪了该文件,要想git应用你编写的全新的忽略规则,你需要先执行git rm -r --cached .(注意该命令最后还有一个点),然后将所有文件添加到暂存区,再commit,这样你编写的新的忽略规则才会生效,具体过程如下:

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

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 忽略项目根目录下的build文件夹及其内部所有的子文件夹和文件
/build/

# 忽略项目根目录下的build文件夹内部所有的子文件夹和文件,注意,和上面一条不同的是
# 本规则不会忽略build文件夹本身
/build/*

# 忽略项目中所有的zip文件
*.zip

# 忽略项目中所有log文件夹及其中的所有子文件夹和文件
**/log/

# 忽略构建版本为3以下的apk文件
/build/release_[0-2].*.apk

# 忽略macOS在目录中生成的.DS_Store文件
**/.DS_Store