忽略文件和目录
常见编程语言的.gitignore模板
https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
规则
-
.gitignore与.git在同一级目录才能生效
-
被忽略的文件夹和文件不会被git add,不会被追踪和加入版本库。
-
每条过虑规则占用一行
-
空行不匹配任何文件,因此常用作分隔符(以方便阅读)
-
开头的行表示注释
-
路径分隔符统一使用 / ,不要用 \ ,即使是Windows系统
-
当/在开头时,表示从.gitignore文件所在目录开始匹配。否则,下级都将匹配。ax,则/x/ax,/x/y/ax,/y/ax都会被忽略。/ax,则仅忽略根目录下的ax(ax目录或文件)。
-
当/在末尾时,只匹配目录,否则,则同名的目录和文件都将匹配。ax,会忽略/ax,/x/ax(ax是文件夹),/y/x/ax(ax是文件)。ax/,会忽略/x/ax(ax是文件夹),不会忽略/x/ax(ax是文件)。
-
*可以匹配任何字符(0次或多次),?可以匹配任何字符(1次)【注意它们都不可以匹配 / 】
-
[ ] 通常用于匹配一个字符列表,如:a[mn]z可匹配amz和anz
-
原先被排除的文件,使用!模式可以被重新包含,但是如果该文件的父级目录被排除了,即使使用!也不会再被包含进来。
-
** 用于匹配多级目录,如a/**/b可以匹配a/x/b和a/x/y/b
-
git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效
实战
假设仓库文件夹名称是repository,.git在repository目录下。
忽略所有内容
*
或 /*
忽略所有目录
*/
忽略public目录下的所有文件,除了favicon.ico文件
下面的达不到目的,因为父级目录被排除了
/public
!/public/favicon.ico
这样和上边一样,也达不到目的,原因一样
/public/
!/public/favicon.ico
下面的可以
/public/*
!/public/favicon.ico
只保留public目录下的所有a{一个字符}z.{后缀名}的所有文件
/public/*
!/public/a?z.*
*.a
!lib.a
会忽略所有.a结尾的文件,如repository/hello.a,repository/x/good.a,但是不会忽略repository/lib.a,repository/x/lib.a
/TODO
仅仅忽略repository/TODO文件夹下的所有内容和repository/TODO文件,但是不会忽略repository/x/TODO文件夹或文件
TODO/
会忽略repository/TODO文件夹下的所有内容,但不会忽略repository/TODO文件以及repository/x/TODO文件夹或文件
/TODO:
会忽略repository/TODO文件,不会忽略repository/TODO文件夹,:结尾表示文件,/结尾表示文件夹
doc/*.txt
会忽略repository/doc/notes.txt,repository/x/doc/notes.txt,但不会忽略repository/doc/server/arch.txt
!/bin/run.sh
不忽略repository/bin/run.sh
**/foo
忽略repository/foo, repository/a/foo, repository/a/b/foo等
debug/*.obj
忽略repository/debug/io.obj,不忽略 repository/debug/common/io.obj 和 repository/tools/debug/io.obj
[Ll]og/
!/Common/Log/
忽略Log和log文件夹,除了....../Common/Log
.gitignore生效
如果暂存区已经存在a.txt,然后在.gitignore添加一行a.txt后,git add仍旧会把a.txt提交到暂存区进而提交到版本库。
解决办法:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
说明:先清空暂存区,那么工作区的所有文件都变成未追踪的,再次提交就可以了。值得注意的是,git rm -r --cached .时,要避免丢失其他非忽略文件的更新,git add . 时要避免提交了不想被忽略但是又不想本次就git add的文件。
所以上述做法,最好在当前工作告一段落暂存区和工作区完全一样的情况下,再进行此操作。
当然也可以针对性的在暂存区删除被忽略的文件,或者先将暂存区被忽略的文件恢复到工作区,再从暂存区删除被忽略的文件,再进行git add。
检查是否被忽略
检查public目录是否已经被忽略
git check-ignore public/
如果被忽略,回车后命令行输出路劲名,没被忽略,则什么也不输出。
查看是哪一条规则导致public目录被忽略
git check-ignore -v public/
查看文件的状态进行判断
git status
列出所有被忽略的文件
git status -s --ignore