.gitignore详解

一、为什么使用 .gitignore ?

在一些项目中,我们不想让本地仓库的所有文件都上传到远程仓库中,而是有选择的上传,比如:一些依赖文件(node_modules下的依赖)、bin 目录下的文件、测试文件等。一方面将一些依赖、测试文件都上传到远程传输量很大,另一方面,一些文件对于你这边是可用的,在另一个人那可能就不可用了,比如:本地配置文件。

为了解决上述问题,git 引入了 .gitignore 文件,使用该文件来选择性的上传文件。

二、使用规则

2.1 注释

注释使用 # 开头,后面跟注释内容。如下所示:

gitignore 复制代码
# local env files
.env.local
.env.*.local

# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*

上例中,以 # 开头的便是注释。

2.2 忽略文件

(1)忽略文件和目录

例如:folderName : 表示忽略 folderName 文件和 folderName 目录,会自动搜索多级目录,比如:*/*/folderName

来看一个简单的例子,本地仓库的目录结构如下所示:

css 复制代码
.
├── folder
│   └── file1
└── src
    ├── folder
    └── utils
        └── folder

其中,.gitignore 文件内容如下所示:

gitignore 复制代码
folder

故在本地仓库中,同名的 folder 目录、src/folder 文件、src/utils/folder 文件都会被忽略,即:不会被提交到远程仓库中。

(2)仅忽略文件

模式如下所示:

folderName

!folderName/

仅忽略 folderName 文件,而不忽略 folderName 目录,其中,感叹号 "!" 表示反向操作。

来看一个简单的例子,本地仓库的目录结构如下所示:

css 复制代码
.
├── folder
│   └── file1
└── src
    ├── folder
    └── utils
        └── folder

其中,.gitignore 文件内容如下所示:

kotlin 复制代码
# this is .gitignore file.
# 以下是忽略的文件
 
folder
!folder/

故在本地仓库中,src/folder 文件、src/utils/folder 文件会被忽略,而同名的 folder 目录不会被忽略。

2.3 忽略目录

模式如下所示:

folderName/

忽略 folderName 目录,包括:

(1)当前目录下的foldernName,例如:folderName/

(2)多级目录下的 folderName,例如:*/*/folderName/

来看一个简单的例子,本地仓库的目录结构如下所示:

css 复制代码
.
├── folder
│   └── file1
└── src
    ├── folder
    └── utils
        └── folder

其中,.gitignore 文件内容如下所示:

kotlin 复制代码
# this is .gitignore file.
# 以下是忽略的文件
 
folder/

故在本地仓库中,folder 目录会被忽略,而同名的 src/folder 文件和 src/utils/folder 文件不会被忽略。

2.4 使用通配符

常用的通配符有:

(1)星号"*" :匹配多个字符;

(2)问号"?":匹配除 '/'外的任意一个字符;

(3)方括号"[xxxx]":匹配多个列表中的字符;

来看一个简单的例子,本地仓库的目录结构如下所示:

csharp 复制代码
.
├── src
│   ├── add.c
│   ├── add.i
│   └── add.o
├── test.c
├── test.i
└── test.o

其中,.gitignore 文件内容如下所示:

ini 复制代码
# this is .gitignore file.
# 以下是忽略的文件
 
*.[io]

故在本地仓库中,test.i文件、test.o文件、src/add.o文件、src/add.i文件会被忽略,而 test.c文件和add.c 文件不会被忽略。注意:这里忽略的匹配模式是多级目录的。

2.5 反向操作

模式如下所示:

!匹配模式

表示之前忽略的匹配模式再次包含在跟踪内容里。

例如在仅忽略文件时提到的模式:

diff 复制代码
folderName
 
!folderName/

表示仅忽略 folderName 文件,而不忽略 folderName 目录。

2.6 双星号

斜杠后紧跟两个连续的星号"**",表示多级目录。

来看一个简单的例子,.gitignore文件的内容如下所示:

bash 复制代码
# this is .gitignore file.
# 以下是忽略的文件
 
src/**/file

可以表示忽略 src/folder1/filesrc/folder1/folder2/***/foldern/file 等。

2.7 其它规则

  • 空行不匹配任何文件;
  • git 跟踪文件,而不是目录;
  • 在 .gitignore 文件中,每行表示一种模式;
  • 如果本地仓库文件已被跟踪,那么即使在 .gitignore 中设置了忽略,也不起作用。
  • .gitignore 文件也会被上传的到远程仓库,所以,同一个仓库的人可以使用同一个.gitignore 文件。

2.8 小计

  1. 匹配模式前加 / 代表项目根目录
  2. 匹配模式最后加 / 代表是目录
  3. 匹配模式前加 代表取反
  4. * 代表任意字符
  5. 表示匹配任意字符
  6. ** 表示匹配多级目录

三、总结

在使用 git 过程中,掌握 .gitignore 的使用很重要,可以减少不必要的文件上传到远程。

相关推荐
哈基米喜欢哈哈哈37 分钟前
Kafka复制机制
笔记·分布式·后端·kafka
君不见,青丝成雪1 小时前
SpringBoot项目占用内存优化
java·spring boot·后端
追逐时光者2 小时前
一个 .NET 开源、功能强大的在线文档编辑器,类似于 Microsoft Word,支持信创!
后端·.net
想买CT5的小曹2 小时前
SpringBoot如何获取系统Controller名称和方法名称
java·spring boot·后端
修一呀4 小时前
[后端快速搭建]基于 Django+DeepSeek API 快速搭建智能问答后端
后端·python·django
哈基米喜欢哈哈哈4 小时前
Spring Boot 3.5 新特性
java·spring boot·后端
当无4 小时前
Mac 使用Docker部署Mysql镜像,并使用DBever客户端连接
后端
野生的午谦4 小时前
PostgreSQL 部署全记录:Ubuntu从安装到故障排查的完整实践
后端
David爱编程5 小时前
可见性问题的真实案例:为什么线程看不到最新的值?
java·后端