如何使用 .gitignore 文件

Git作为一种广泛应用的版本控制系统,为开发人员的项目协作提供了有力支持。它不仅能跟踪项目随时间推移所做的修改,还允许在必要时将项目回退到之前的版本。其工作流程主要包括使用git add命令添加文件,然后通过git commit命令提交文件。

在团队项目开发中,有时某些文件或部分内容并不适合与他人共享,即不需要将其包含或提交到项目的主版本中。例如,使用git commit命令时,默认会添加所有文件,包括那些不必要或不应该提交的文件。虽然Git没有专门的git ignore命令来实现忽略特定文件的功能,但可以借助.gitignore文件达成这一目的。

本文将详细介绍.gitignore文件,包括其概念、使用方式以及如何忽略先前已提交的文件,帮助开发人员更好地管理项目文件。

一、什么是 .gitignore文件

在任何有效的Git仓库中,文件可分为以下几类:

  1. 追踪的(tracked) :指Git已知的所有文件或目录,这些文件和目录是通过git add添加并由git commit提交到主仓库的。

  2. 未被追踪的(untracked) :在工作目录中新建但尚未通过git add暂存的文件或目录。

  3. 被忽略的(ignored):Git明确要排除、忽略,在Git仓库中无需关注的文件或目录。本质上,这是一种告知Git哪些未被追踪的文件应始终保持未追踪状态且永不提交的机制。

所有被忽略的文件都记录在.gitignore文件中。.gitignore是一个纯文本文件,其中包含了项目中需要Git忽略和不追踪的特定文件和文件夹列表。在该文件中,可以通过指定特定文件或文件夹的名称或模式,来让Git忽略单个或多个文件、文件夹。

二、使用.gitignore文件

通常,.gitignore文件放置在仓库的根目录(也称为父目录或当前工作目录)下,该目录包含了构成项目的所有文件和其他文件夹。当然,也可以将其放在版本库的任何文件夹中,甚至可以有多个.gitignore文件。

在基于Unix的系统(如macOS或Linux)中,若要通过命令行创建.gitignore文件,可先打开终端程序(如macOS上的Terminal.app),然后使用cd命令导航到包含项目的根文件夹,执行以下命令创建文件:

复制代码
touch.gitignore

需要注意的是,名称前带点(.)的文件默认是隐藏的,单独使用ls命令时无法查看隐藏文件。若要在命令行中查看包括隐藏文件在内的所有文件,需在ls命令中添加-a标志,如下所示:

bash 复制代码
ls -a

三、.gitignore文件应包含的内容

一般来说,应添加到.gitignore文件中的文件类型主要是那些不需要提交的文件。可能出于安全考虑,或者因为它们是本地文件,对其他项目开发者无必要。常见的此类文件包括:

  1. 操作系统文件 :不同操作系统(如macOS、Windows和Linux)会生成特定的隐藏文件,其他开发者无需使用,因为其系统也会生成。例如,macOS上的Finder会生成.DS_Store文件,用于存储用户对文件夹外观和显示的偏好设置,如图标大小和位置。

  2. 应用程序生成的配置文件:由代码编辑器和IDE(集成开发环境)等应用程序生成的配置文件,这些文件是根据个人配置和偏好定制的。

  3. 自动生成的文件和编译特定文件 :从项目使用的编程语言或框架自动生成的文件,以及编译后的特定代码文件,如.o文件。

  4. 软件包管理器生成的文件夹 :如npm的node_modules文件夹,用于保存和跟踪本地安装的每个软件包的依赖关系。

  5. 包含敏感数据和个人信息的文件 :例如包含凭证(用户名和密码)的文件以及含有环境变量的文件,如.env文件(通常包含需要保密的API密钥)。

  6. 运行时文件 :如.log文件,用于记录操作系统的使用活动、错误信息以及事件历史。

四、在Git中忽略文件和文件夹的方法

  1. 忽略特定文件 :若只想忽略一个特定文件,需提供该文件在项目根目录下的完整路径。例如,要忽略根目录下的text.txt文件,可在.gitignore文件中添加:
arduino 复制代码
/text.txt

若文件位于根目录下的test目录中,如test/text.txt,则可按如下方式添加:

arduino 复制代码
/test/text.txt

也可写成:

bash 复制代码
test/text.txt
  1. 忽略同名文件 :若要忽略所有具有特定名称的文件,只需写出该文件的字面名称。例如,要忽略任何text.txt文件,可在.gitignore中添加:
arduino 复制代码
text.txt

此时无需提供完整路径,该模式将忽略项目中任何位置的同名文件。3. 忽略整个目录及其内容 :要忽略整个目录及其所有内容,需包含目录名称,并在末尾添加斜线/。例如,要忽略名为test的目录(包括其中的所有文件和子目录),可添加:

bash 复制代码
test/

需要注意的是,如果仅写文件或目录的名称而不添加斜线/,该模式将同时匹配任何带有此名称的文件或目录,例如:

bash 复制代码
# 匹配任何名字带有test的文件和目录
test
  1. 忽略以特定单词开头的文件或目录 :若要忽略所有名称以特定单词开头的文件或目录,需指定要忽略的名称,后跟*通配符选择器。例如,要忽略所有以img开头的文件和目录,可添加:
css 复制代码
img*
  1. 忽略以特定扩展名结尾的文件 :若要忽略所有以特定文件扩展名结尾的文件,需使用*通配符选择器,后跟要忽略的文件扩展名。例如,要忽略所有以.md文件扩展名结尾的markdown文件,可在.gitignore文件中添加:

    *.md

此模式将匹配项目中任何位置的以.md为扩展名的文件。6. 对忽略规则设置例外 :假设在.gitignore文件中添加了忽略所有.md文件的规则(如.md),但不希望Git忽略README.md文件。此时,可使用带有感叹号的否定模式(!)来排除特定文件,如下所示:

yaml 复制代码
# 忽略所有.md文件
.md
# 不忽略README.md文件
!README.md

通过在.gitignore文件中同时使用这两种模式,可实现除README.md文件外,忽略所有以.md结尾的文件。但需要注意的是,如果忽略了整个目录,此模式将不起作用。例如,已忽略所有test目录(test/),即使在test文件夹内有不想忽略的example.md文件,也无法通过!test/example.md这样的方式排除。

五、忽略先前提交的文件

创建新仓库时,最佳实践是在提交之前创建包含所有要忽略文件和不同文件模式的.gitignore文件。因为Git只能忽略尚未提交到仓库的未被追踪的文件。

若之前已提交了某个文件但希望撤回,例如不小心提交了存储环境变量的.env文件,可按以下步骤操作:

  1. 更新.gitignore文件以包含.env文件:
bash 复制代码
# 给.gitignore添加.env文件
echo ".env" >>.gitignore
  1. 告知Git不要追踪该文件,将其从索引中删除:
bash 复制代码
git rm --cached.env

git rm命令配合--cached选项,可从版本库中删除文件,但不会删除实际文件,该文件仍会在本地系统和工作目录中作为被忽略的文件存在。此时,git status会显示文件已不在版本库中,而ls命令会显示文件仍存在于本地文件系统中。若要从版本库和本地系统中删除该文件,则省略--cached选项。3. 使用git add命令将.gitignore添加到暂存区:

csharp 复制代码
git add.gitignore
  1. 最后,使用git commit命令提交.gitignore文件:
sql 复制代码
git commit -m "update ignored files"
相关推荐
Victor3561 小时前
Redis(76)Redis作为缓存的常见使用场景有哪些?
后端
Victor3561 小时前
Redis(77)Redis缓存的优点和缺点是什么?
后端
摇滚侠4 小时前
Spring Boot 3零基础教程,WEB 开发 静态资源默认配置 笔记27
spring boot·笔记·后端
Y42584 小时前
本地多语言切换具体操作代码
前端·javascript·vue.js
天若有情6736 小时前
Java Swing 实战:从零打造经典黄金矿工游戏
java·后端·游戏·黄金矿工·swin
速易达网络7 小时前
Bootstrap 5 响应式网站首页模板
前端·bootstrap·html
etsuyou7 小时前
js前端this指向规则
开发语言·前端·javascript
lichong9517 小时前
Android studio 修改包名
android·java·前端·ide·android studio·大前端·大前端++
cai_huaer7 小时前
BugKu Web渗透之 cookiesWEB
前端·web安全
一只叫煤球的猫7 小时前
建了索引还是慢?索引失效原因有哪些?这10个坑你踩了几个
后端·mysql·性能优化