gitignore 忽略特定文件
概述
当你在 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.gitignore 与 C++.gitignore 组合成一个 .gitignore
来满足项目中既有 C 代码也有 C++ 代码的情况。
克隆远程 gitignore 仓库:
git clone https://github.com/github/gitignore
用法例子
还是以 C.gitignore 为例,讲解一下 .gitignore
的用法与编写规则:
# Prerequisites
*.d
- 以
#
开头的行代表注释; - 匹配当前目录与子目录下所有以
.d
结尾的文件或者文件夹;比如它将匹配foo.d
,bar/foo.d
文件或path.d/
,bar/path.d/
文件夹; - 空行表示不匹配任何文件,所以空行可用作分隔行提高可读性。
*.dSYM/
*.mod*
modules.order
Module.symvers
Mkfile.old
dkms.conf
- 如果某一行是以右斜杠结尾,它将只匹配文件夹;换言之,
*.dSYM/
代表的意思是匹配当前目录与子目录下所有以.dSYM/
结尾的文件夹,但不匹配以.dSYM
结尾的普通文件或软链接符号;比如它只匹配foo.dSYM/
,bar/foo.dSYM/
文件夹; - 匹配当前目录与子目录下所有包含
.mod
的文件或者文件夹;比如它匹配.mod
,foo.mod
,foo.module
,foo.mod.d
等; - 匹配当前目录与子目录下具体名称的
modules.order
文件或文件夹。
接下来我们以 Autotools.gitignore 为例,重点看看右斜杠 "/"
在 .gitignore
的匹配规则:
Makefile.in
/autoscan.log
m4/libtool.m4
- 不带右斜杠,匹配当前目录与子目录下所有的
Makefile.in
文件或文件夹; - 以右斜杠开头,将仅匹配当前目录下的
autoscan.log
,但不匹配foo/autoscan.log
文件; - 模式当中包含右斜杠
("/")
的话,将只匹配当前目录下的m4/libtool.m4
,但不匹配foo/m4/libtool.m4
; - 归纳为,如果模式当中包含右斜杠,将只匹配当前目录下的文件或文件夹;因此
m4/libtool.m4
也等同于/m4/libtool.m4
的写法。
我们再以 CakePHP.gitignore 为例,讲解一下感叹号 "!"
的用法:
/tmp/cache/models/*
!/tmp/cache/models/empty
- 忽略
/tmp/cache/models
文件夹下的所有文件; - 但不忽略
/tmp/cache/models/empty
文件; - 以
("!")
开头的行将不会被忽略,一般用于希望忽略整个文件夹的内容,但仍有部分文件或文件夹需要更新到仓库中的情况。 - 使用
"\"
能够对"!"
进行转义,如\!important.txt
匹配的是文件名以"!"
开头的!important
文件。
接下来我们看看 NetBeans.gitignore 与 JetBrains.gitignore 关于 ("**")
双星号的用法:
**/nbproject/private/
.idea/**/workspace.xml
- 以
"**"
加上"/"
开头匹配所有的文件夹; - 右斜杠带上
"**"
后面再带一个右斜杠表示匹配 0 个或任意多个文件夹;.idea/**/workspace.xml
匹配.idea/workspace.xml
,.idea/foo/worksapce.xml
或者.idea/foo/bar/workspace.xml
;
最后我们看看一些中括号表达式的使用例子,可以参考 Actionscript.gitignore,Vim.gitignore 或 TeX.gitignore 等:
[Bb]in/
*.py[cod]
[._]sw[a-p]
*.eledsec[1-9][0-9]
[]
是定义匹配的字符范围。比如[a-zA-Z0-9]
表示相应位置的字符要匹配英文字符和数字;[Bb]in/
匹配Bin/
与bin/
文件夹;- 匹配
*.pyc
,*.pyo
及*.pyd
; - 匹配以
.
或_
开头,后跟swa
,swb
,swc...swp
的字符; - 匹配最后两位从
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
相关文章
- Python数据处理 | 批量提取文件夹下的csv文件,每个csv文件根据列索引提取特定几列,并将提取后的数据保存到新建的一个文件夹
- 修改文件(夹)的用户访问权限的程序代码
- java文件下载
- 11月8日科技资讯|马云:蚂蚁最应该感谢微信;波音软件修复文件不合格;谷歌开源Cardboard|极客头条
- Javascript 文件命名规范
- 链家网8000+万个文件何处安家?
- ClickHouse奇技淫巧系列之SQL查文件
- Win10系统下如何在某个特定的文件夹内输出所有文件路径
- 彻底解决java WEB项目的文件路径问题(war包)
- Android dump .so 文件crash log
- Linux 文件压缩和归档命令(command)总结
- linux统计文件中字符串次数及文件夹下特定类型文件个数
- Windows、Linux下文件操作(写、删除)错误的产生原因、及解决方法
- 【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )
- java如何压缩多个文件到压缩包,并下载到浏览器?
- shell脚本选择LOG里面特定的行,生成新文件并rsync上传
- Linux文件查看与编辑