今天,在Android studio上进行git开发,把本地的文件通过git push到远程仓库,发现很多不必要的文件也被跟踪了,导致项目非常大。上网找了一下.gitignore的规则,发现讲的都模棱两可。想想还是得靠自己,去Git官方网站看了官方文档,这里做个记录,对官方文档做一下简单的翻译。备后续查看。
官方文档链接:gitignore
gitignore
指定不需要跟踪的文件进行忽略。
概要
$HOME/.config/git/ignore, $GIT_DIR/info/exclude, .gitignore
描述
一个gitignore文件指定git需要忽略的文件。 对git已经跟踪的文件不起作用。具体查看后续NOTE。
在gitignore文件中的每一行均指定了一个模式,当决定一个文件路径是否需要忽略时,git会以以下顺序查看下列文件(优先级从高至低,在同一个优先级内,最后一个匹配的模式决定是否忽略文件)。
1. 在命令行上指定的模式。
2. 从相同目录中的.gitignore文件中读取的模式。或者上层目录中的模式(向上至目录树的顶点),但是在越低的目录级别中优先级越高(直到文件所在目录)。这些.gitignore文件对与其在相同目录中的文件有效。一个项目通常在一个仓库包含一个.gitignore文件,文件指定的模式包括项目的生成文件。
3. 从.git/ingo/exclude
文件中读取的模式
4. 来自配置变量core.excludesFile
指定的模式
将哪些文件放置到哪种模式中取决于取决于这个模式将被怎样使用:
1. 不应该被版本管理,也不应该被通过clone
分发到其他仓库中的文件写入.gitignore文件中(比如所有人都想忽略的文件)
Patterns which should be version-controlled and distributed to other repositories via clone (i.e., files that all developers will want to ignore) should go into a .gitignore file.(这个貌似是官网写错了,应该是”should not be version-controlled”)
2. 只对一个特定的仓库有效但是没有必要与其他仓库共享(比如,只对一个用户的流程有效的辅助文件)应该写入.git/ingo/exclude
中。
3. 一个用户希望Git在任何情况下都忽略的文件(比如备份或临时文件),应该添加到core.excludesFile
中(用户的!/.giconfig
),如果用户的$XDG_CONFIG_HOME
没有被设置或者为空, $HOME/.config/git/ignore
将会生效。
模式格式
- 空格不匹配文件,所以可以使用空格分隔符来增加可读性
- 以
#
开始的行为注释,在前面添加一个\
可以用来匹配一个以#
开头的文件。 - 结尾空白会被忽略,除非使用
\
将空格分开 !
将取消一个匹配,所有在之前忽略的模式中被忽略的文件文件将被重新包括到版本控制中。如果一个文件的父目录被忽略了,不可能将该文件再添加到版本控制中。因为性能的原因,git不会列出所有的被忽略的目录,针对这些目录中的文件的模式,无论在哪个文件中被指定都无效。
在第一个!
之前添加\
将会匹配以!
开头的文件,比如\!important!.txt
foo/
将会匹配foo目录下的所有文件以及其子目录下的所有目录。通配符不会匹配pathnam/
下的目录的的文件。比如Documentation/*.html
匹配Documentation/git.html
但是不匹配Documentation/ppc/ppc.html
和tools/perf/Documentation/perf.html
.(*
不能跨目录匹配)- 以
/
开头匹配当前目录,比如,匹配/*.c
匹配cat-file.c
但是不匹配mozilla-sha1/sha1.c
.
- 以
**/
开头表示匹配所有目录,比如,**/foo
匹配所有目录下的foo文件和foo目录,和foo
效果相同。**/foo/bar
匹配所有在foo
目录下的bar文件和bar目录。 - 结尾的
/**
匹配所有目录内的文件。比如abc/**
匹配所有abc
目录下的文件。 a/**/b
匹配a/b
,a/x/b
,a/x/y/b
and so on.- 其他情况下的
**
无效
- 以
NOTE:取消追踪一个已被追踪的文件
使用git rm --cached
github上有.gitignore的模板项目,链接如下:https://github.com/github/gitignore