搜索下吧!贴的都是写细枝末节,所以自己翻译下官方文档吧。文档地址
名称:
gitignore:指定不想被跟踪的文件(跟踪:untrack,等同于 同步、版本控制)
语法:
$HOME/.config/git/ignore, $GIT_DIR/info/exclude, .gitignore
($GIT_DIR是指.git文件,就是使用git init后生成的隐藏文件。如果你设置了GIT_DIR环境变量,那就会被覆盖.git文件,这样做不好哦)
详细描述:
gitignore文件用于指定不想跟踪(同步)的文件,已经被Git跟踪的文件不会受到印象。
gitignore文件的每一行都指定了一种模式(pattern)。当决定是否要忽略某一路径时,git会从多个文件源检查gitignore模式。并依照下文的顺序,从高优先级——》低优先级(同一优先级,最后一个匹配的模式决定了是否进行忽略)进行匹配。
模式读取来源:
1.支持gitignore的命令行(commadn line) (如git ls-files)
2. .gitignore文件中读取,目录是当前命令行的目录,或者其父目录。并且低层次的父目录会覆盖高层次的父目录。所以该模式和.gitignore文件的位置有关系,通常project中都会有一个.gitignore文件,因为他在目录中层次最低,所以优先级最高(可覆盖上层规则)。
3. $GIT_DIR/info/exclude
4.被core.excludesFile配置变量指定的文件
选那个文件存放模式:
1.需要被版本控制
,通过clone发布到别的仓库:写进.gitignore文件里 (通过上下文的语义可以看出,小明复制了小强的A仓库,这个复制的就是别的仓库了)
2.指定一个仓库,不被别人仓库共享的:写进$GIT_DIR/info/exclude文件里 (例如一个你自己编写的测试文件,就没必要分享给别人了)
3.在任何情况下都希望被忽略的:在~/.gitconfig目录下core.excludesFile。该默认值是$XDG_CONFIG_HOME/git/ignore
,如果$XDG_CONFIG_HOME/git/ignore 是空或未设置,就用$HOME/.config/git/ignore代替。
(上面说的$XDG_CONFIG_HOME 是一些环境变量,类似PATH 一般类linux中有指定。Ubuntu就有$HOME这个目录,其他也不清楚了⊙﹏⊙b汗)
底层的git管道工具(就是过滤的意思吧!linux的管道符)如git list-files、git read-tree,通过指定的命令行选项 读取gitignore模式,或从文件中读取。高级的git工具如git status、git add将从上文指定的来源读取模式。
模式格式:
1.空行不匹配任何文件,可以用来分块增加可读性
2.以#开头作为 注释,Put a backslash ("\
")
in front of the first hash for patterns that begin with a hash.(不太理解,怎么还和hash有关了,有谁知道吧?)
3.末尾的空格被忽略,除非被反斜杠"\
"(转义符)引用。
4.前缀!用来反模式:就是去反的操作。 如果目录被ignore了,文件取反也不能被track跟踪。
5.后缀斜线/,只匹配目录和其下面的文件,不匹配该名称的文件。 如hello/ 不匹配hello文件。
6.如果模式中没有反斜杠/,git将把它当做shell统配符并且目录相对于.gitignore文件的位置。
7.否则将被当做shell中的通配符处理,并且通配符不能代表/ 。如"Documentation/*.html"匹配"Documentation/git.html"
但是不匹配"Documentation/ppc/ppc.html" or "tools/perf/Documentation/perf.html" 。
8.头部的斜杠"\"匹配开头的路径(也就是目录了),例如:"/*.c"匹配"cat-file.c",但不匹配"mozilla-sha1/sha1.c"。
两个连续的星号"**",匹配所有的路径,有着特殊的含义:
1.开头两星,跟一斜线,匹配所含有路径。如:“**/foo”,匹配任意地方的foo文件或目录。“**foo/bar"匹配紧跟在任意foo目录下的文件或目录”bar".
2.末尾“/**",匹配其内的任何东西。如"abc/**",匹配abc目录下的所有文件。
3.斜杠两星斜杠 ,匹配0或任意目录。如“a/**/b",匹配"a/b" "a/c/b" "a/c/d/b"
4.其他连续的星号视为无效。
注意:
gitignore文件的目的是确保还未被 跟踪的文件,不会被跟踪。
停止已被跟踪的文件,使用git rm --cached
举例:如何只track某一文件夹下的文件:
$ cat .gitignore # exclude everything except directory foo/bar /* !/foo /foo/* !/foo/bar
这个通配符不能代表”/" 即目录很关键。得用**代表任意目录,这和android那个proguard差不多