Git作为一种广泛应用的版本控制系统,为开发人员的项目协作提供了有力支持。它不仅能跟踪项目随时间推移所做的修改,还允许在必要时将项目回退到之前的版本。其工作流程主要包括使用git add
命令添加文件,然后通过git commit
命令提交文件。
在团队项目开发中,有时某些文件或部分内容并不适合与他人共享,即不需要将其包含或提交到项目的主版本中。例如,使用git commit
命令时,默认会添加所有文件,包括那些不必要或不应该提交的文件。虽然Git没有专门的git ignore
命令来实现忽略特定文件的功能,但可以借助.gitignore
文件达成这一目的。
本文将详细介绍.gitignore
文件,包括其概念、使用方式以及如何忽略先前已提交的文件,帮助开发人员更好地管理项目文件。
一、什么是 .gitignore文件
在任何有效的Git仓库中,文件可分为以下几类:
-
追踪的(tracked) :指Git已知的所有文件或目录,这些文件和目录是通过
git add
添加并由git commit
提交到主仓库的。 -
未被追踪的(untracked) :在工作目录中新建但尚未通过
git add
暂存的文件或目录。 -
被忽略的(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
文件中的文件类型主要是那些不需要提交的文件。可能出于安全考虑,或者因为它们是本地文件,对其他项目开发者无必要。常见的此类文件包括:
-
操作系统文件 :不同操作系统(如macOS、Windows和Linux)会生成特定的隐藏文件,其他开发者无需使用,因为其系统也会生成。例如,macOS上的Finder会生成
.DS_Store
文件,用于存储用户对文件夹外观和显示的偏好设置,如图标大小和位置。 -
应用程序生成的配置文件:由代码编辑器和IDE(集成开发环境)等应用程序生成的配置文件,这些文件是根据个人配置和偏好定制的。
-
自动生成的文件和编译特定文件 :从项目使用的编程语言或框架自动生成的文件,以及编译后的特定代码文件,如
.o
文件。 -
软件包管理器生成的文件夹 :如npm的
node_modules
文件夹,用于保存和跟踪本地安装的每个软件包的依赖关系。 -
包含敏感数据和个人信息的文件 :例如包含凭证(用户名和密码)的文件以及含有环境变量的文件,如
.env
文件(通常包含需要保密的API密钥)。 -
运行时文件 :如
.log
文件,用于记录操作系统的使用活动、错误信息以及事件历史。
四、在Git中忽略文件和文件夹的方法
- 忽略特定文件 :若只想忽略一个特定文件,需提供该文件在项目根目录下的完整路径。例如,要忽略根目录下的
text.txt
文件,可在.gitignore
文件中添加:
arduino
/text.txt
若文件位于根目录下的test
目录中,如test/text.txt
,则可按如下方式添加:
arduino
/test/text.txt
也可写成:
bash
test/text.txt
- 忽略同名文件 :若要忽略所有具有特定名称的文件,只需写出该文件的字面名称。例如,要忽略任何
text.txt
文件,可在.gitignore
中添加:
arduino
text.txt
此时无需提供完整路径,该模式将忽略项目中任何位置的同名文件。3. 忽略整个目录及其内容 :要忽略整个目录及其所有内容,需包含目录名称,并在末尾添加斜线/
。例如,要忽略名为test
的目录(包括其中的所有文件和子目录),可添加:
bash
test/
需要注意的是,如果仅写文件或目录的名称而不添加斜线/
,该模式将同时匹配任何带有此名称的文件或目录,例如:
bash
# 匹配任何名字带有test的文件和目录
test
- 忽略以特定单词开头的文件或目录 :若要忽略所有名称以特定单词开头的文件或目录,需指定要忽略的名称,后跟
*
通配符选择器。例如,要忽略所有以img
开头的文件和目录,可添加:
css
img*
-
忽略以特定扩展名结尾的文件 :若要忽略所有以特定文件扩展名结尾的文件,需使用
*
通配符选择器,后跟要忽略的文件扩展名。例如,要忽略所有以.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
文件,可按以下步骤操作:
- 更新
.gitignore
文件以包含.env
文件:
bash
# 给.gitignore添加.env文件
echo ".env" >>.gitignore
- 告知Git不要追踪该文件,将其从索引中删除:
bash
git rm --cached.env
git rm
命令配合--cached
选项,可从版本库中删除文件,但不会删除实际文件,该文件仍会在本地系统和工作目录中作为被忽略的文件存在。此时,git status
会显示文件已不在版本库中,而ls
命令会显示文件仍存在于本地文件系统中。若要从版本库和本地系统中删除该文件,则省略--cached
选项。3. 使用git add
命令将.gitignore
添加到暂存区:
csharp
git add.gitignore
- 最后,使用
git commit
命令提交.gitignore
文件:
sql
git commit -m "update ignored files"