zl程序教程

您现在的位置是:首页 >  其他

当前栏目

gitignore 忽略特定文件

文件 特定 忽略 gitignore
2023-09-27 14:29:24 时间

概述

当你在 Linux 环境进行 C++ 开发的时候,每次编译总会产生大量的目标文件,此时使用 git status 查看总会提示 Untracked files,但这些目标文件又不需要加入到仓库进行管理,所以为了更准确地管理源码文件,并获得更简洁清晰的改动提示。你可以在项目根目录添加一个 .gitignore 文件,并将需要忽略的文件写到该文件中去,Git 将自动忽略这些特定文件。

比如一个典型的 C++ .gitignore 文件类似这样子:

# Compiled object files
*.o
*.obj

此时 Git 将忽略所有以 .o 结尾或者 .obj 结尾的编译目标文件。

当然我不建议你从头开始编写自己的 .gitignore 文件,因为 github 网站已经为我们提供了各种配置文件,你可以 git clone 下来也可以直接在线浏览:https://github.com/github/gitignore,根据自己的需求进行组合即可。比如你可以将 C.gitignoreC++.gitignore 组合成一个 .gitignore 来满足项目中既有 C 代码也有 C++ 代码的情况。

克隆远程 gitignore 仓库:

git clone https://github.com/github/gitignore

用法例子

还是以 C.gitignore 为例,讲解一下 .gitignore 的用法与编写规则:

# Prerequisites
*.d

  1. # 开头的行代表注释;
  2. 匹配当前目录与子目录下所有以 .d 结尾的文件或者文件夹;比如它将匹配 foo.dbar/foo.d 文件或 path.d/bar/path.d/ 文件夹;
  3. 空行表示不匹配任何文件,所以空行可用作分隔行提高可读性。
*.dSYM/
*.mod*
modules.order
Module.symvers
Mkfile.old
dkms.conf
  1. 如果某一行是以右斜杠结尾,它将只匹配文件夹;换言之,*.dSYM/ 代表的意思是匹配当前目录与子目录下所有以 .dSYM/ 结尾的文件夹,但不匹配以 .dSYM 结尾的普通文件或软链接符号;比如它只匹配 foo.dSYM/bar/foo.dSYM/ 文件夹;
  2. 匹配当前目录与子目录下所有包含 .mod 的文件或者文件夹;比如它匹配 .modfoo.modfoo.modulefoo.mod.d 等;
  3. 匹配当前目录与子目录下具体名称的 modules.order 文件或文件夹。

接下来我们以 Autotools.gitignore 为例,重点看看右斜杠 "/".gitignore 的匹配规则:

Makefile.in
/autoscan.log
m4/libtool.m4
  1. 不带右斜杠,匹配当前目录与子目录下所有的 Makefile.in 文件或文件夹;
  2. 以右斜杠开头,将仅匹配当前目录下的 autoscan.log,但不匹配 foo/autoscan.log 文件;
  3. 模式当中包含右斜杠 ("/") 的话,将只匹配当前目录下的 m4/libtool.m4,但不匹配 foo/m4/libtool.m4
  4. 归纳为,如果模式当中包含右斜杠,将只匹配当前目录下的文件或文件夹;因此 m4/libtool.m4 也等同于 /m4/libtool.m4 的写法。

我们再以 CakePHP.gitignore 为例,讲解一下感叹号 "!" 的用法:

/tmp/cache/models/*
!/tmp/cache/models/empty
  1. 忽略 /tmp/cache/models 文件夹下的所有文件;
  2. 但不忽略 /tmp/cache/models/empty 文件;
  3. ("!") 开头的行将不会被忽略,一般用于希望忽略整个文件夹的内容,但仍有部分文件或文件夹需要更新到仓库中的情况。
  4. 使用 "\" 能够对 "!" 进行转义,如 \!important.txt 匹配的是文件名以 "!" 开头的 !important 文件。

接下来我们看看 NetBeans.gitignoreJetBrains.gitignore 关于 ("**") 双星号的用法:

**/nbproject/private/
.idea/**/workspace.xml
  1. "**" 加上 "/" 开头匹配所有的文件夹;
  2. 右斜杠带上 "**" 后面再带一个右斜杠表示匹配 0 个或任意多个文件夹;.idea/**/workspace.xml 匹配 .idea/workspace.xml.idea/foo/worksapce.xml或者 .idea/foo/bar/workspace.xml

最后我们看看一些中括号表达式的使用例子,可以参考 Actionscript.gitignoreVim.gitignoreTeX.gitignore 等:

[Bb]in/
*.py[cod]
[._]sw[a-p]
*.eledsec[1-9][0-9]
  1. [] 是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字;[Bb]in/ 匹配 Bin/bin/ 文件夹;
  2. 匹配 *.pyc*.pyo*.pyd
  3. 匹配以 ._ 开头,后跟 swaswbswc...swp 的字符;
  4. 匹配最后两位从 10 开始直到 99 的数字。

编写规则

  • 空行不匹配任何文件;
  • "#" 开头的行代表注释;
  • "!" 开头的行不被忽略;
  • 反斜杠 "\" 代表转义;
  • 右斜杠 "/" 结尾仅匹配文件夹;
  • 以右斜杠 "/" 开头或包含在模式中,仅匹配当前文件夹;
  • 星号 "*" 匹配任何字符;
  • 两个星号 "**" 匹配 0 个或任意多个文件夹;
  • 中括号 "[]" 表达式定义匹配的字符范围。

忽略规则

在 gitignore 文件中,每一行指定了一个忽略规则,当决定是否忽略一个路径的时候,Git 通常会从多个源进行检查,优先级从高到低:

  • 从命令行读取可用的忽略规则;
  • 从当前目录读取 .gitignore 文件;
  • 读取 Git 仓库目录下的 .git/info/exclude 文件;
  • 读取 core.excludesFile 参数定义的文件,默认值是 $XDG_CONFIG_HOME/git/ignore,如果环境变量 $XDG_CONFIG_HOME 未定义或者为空,则默认读取 ~/.config/git/ignore 文件。

参考文档

[1] Pro Git
[2] gitignore 官方文档
[3] Git教程 - 廖雪峰的官方网站
[4] git help ignore
[5] man gitignore