Git是一个流行的版本控制系统。它是开发人员如何在项目中协作和工作的方式。
Git允许您跟踪随着时间推移对项目所做的更改。除此之外,如果您想撤消更改,它还允许您恢复到以前的版本。
Git的工作方式是使用Git add命令在项目中暂存文件,然后使用Git commit命令提交文件。
当你作为团队的一员在一个项目中工作时,有时你不想与他人共享项目的某些文件或部分内容。
换句话说,您不希望将这些特定的文件包含或提交到项目的主版本。这就是为什么你可能不想使用git add .命令将当前git目录中的每一个文件进行升级。
当你使用git commit命令时,每个文件都会被提交——这也包括不需要或不应该提交的文件。
你可能希望Git忽略特定的文件,但是没有Git ignore命令来实现这个目的。
那么,如何告诉Git忽略并不跟踪特定的文件呢?使用.gitignore文件。
在本文中,您将了解什么是.gitignore文件,如何创建一个文件,以及如何使用它来忽略文件和文件夹。您还将看到如何忽略之前提交的文件。
当前运行的Git存储库中的每个文件都有以下状态之一:
tracked -这些是Git所知道的所有文件或目录。这些是新暂存(用git add添加的)和提交(用git commit提交的)到主仓库的文件和目录。
untracked -这些是在工作目录中创建的任何新文件或目录,但还没有暂存(或使用git add命令添加)。
ignored -这些是Git在Git存储库中完全排除、忽略和不知道的所有文件或目录。从本质上说,这是一种告诉Git哪些未跟踪的文件应该保持不跟踪且永远不提交的方式。
所有被忽略的文件都被放置在.gitignore文件里。
.gitignore文件是一个纯文本文件,它包含来自项目的所有指定文件和文件夹的列表,Git应该忽略和不跟踪这些文件和文件夹。
在.gitignore内部,您可以通过提到特定文件或文件夹的名称或模式,告诉Git只忽略单个文件或文件夹。您还可以使用相同的方法告诉Git忽略多个文件或文件夹。
通常,.gitignore文件被放置在存储库的根目录中。根目录也称为父目录和当前工作目录。根文件夹包含组成项目的所有文件和其他文件夹。也就是说,您可以将它放在存储库中的任何文件夹中。你甚至可以有多个.gitignore文件。
在macOS或者Linux系统中创建.gitignore文件可以使用命令行,打开终端,然后使用cd命令导航到包含项目的根文件夹,并输入以下命令为您的目录创建一个.gitignore文件:
touch .gitignore
默认情况下,名称前面带点(.)的文件是隐藏的。
单独使用ls命令时,隐藏文件是不可见的。要从命令行查看所有文件,包括隐藏文件,使用-a标志和ls命令,如下所示:
ls -a
你应该考虑添加到.gitignore文件中的文件类型是不需要提交的任何文件。出于安全原因,您可能不希望提交它们,或者因为它们对您来说是本地的,因此对于与您从事同一项目的其他开发人员来说是不必要的。
以下这些内容可能会包含在文件中:
操作系统文件。每个操作系统(如macOS、Windows和Linux)都会生成特定于系统的隐藏文件,其他开发人员不需要使用这些文件,因为他们的系统也会生成这些文件。例如,在macOS上,Finder生成一个. ds_store文件,其中包括用户对文件夹外观和显示的首选项,例如图标的大小和位置。
由代码编辑器和IDE (IDE代表集成开发环境)等应用程序生成的配置文件。这些文件是根据您、您的配置和您的首选项设置定制的。
从项目中使用的编程语言或框架自动生成的文件,以及编译后的特定于代码的文件,如.o文件。
包管理器生成的文件夹,比如npm的node_modules文件夹。这是一个用于保存和跟踪本地安装的每个包的依赖项的文件夹。
包含敏感数据和个人信息的文件。此类文件的一些例子是带有您的凭证(用户名和密码)的文件和带有环境变量的文件,如.env文件(.env文件包含需要保持安全和私有的API密钥)。
运行时文件,如.log文件。它们提供关于操作系统的使用活动和错误的信息,以及操作系统中发生的事件的历史记录。
如果您只想忽略一个特定的文件,则需要提供从项目根目录到该文件的完整路径。
如何忽略git里的文件和文件夹
例如,如果你想忽略根目录下的一个text.txt文件,你可以这样做:
/text.txt
如果您想忽略位于根目录下test目录中的text.txt文件,您可以执行以下操作:
/test/text.txt
上面内容也可这样写:
test/text.txt
如果您想要忽略所有具有特定名称的文件,则需要写入文件的字面名称。
例如,如果你想忽略任何text.txt文件,你可以在.gitignore中添加以下内容:
text.txt
在这种情况下,您不需要提供特定文件的完整路径。此模式将忽略位于项目中任何位置的具有该特定名称的所有文件。
要忽略一个完整的目录及其所有内容,你需要在目录名的最后加上斜杠/:
test/
该命令将忽略位于项目中任何位置的名为test的目录(包括该目录中的其他文件和其他子目录)。
需要注意的是,如果只写文件的名称,或者只写目录的名称而不加斜杠/,那么该模式将匹配具有该名称的任何文件或目录:
matches any files and directories with the name test
test
如果您想忽略以特定单词开头的任何文件或目录,该怎么办?
假设您希望忽略所有名称以img开头的文件和目录。要做到这一点,你需要指定你想要忽略的名称,后面跟着*通配符选择器,就像这样:
img*
该命令将忽略所有名称以img开头的文件和目录。
但是,如果您想忽略任何以特定单词结尾的文件或目录,该怎么办呢?
如果希望忽略以特定文件扩展名结尾的所有文件,则需要使用*通配符选择器,后面跟着要忽略的文件扩展名。
例如,如果你想忽略所有以.md文件扩展名结尾的markdown文件,你可以在.gitignore文件中添加以下内容:
*.md
该模式将匹配项目中任何以.md扩展名结尾的文件。
前面介绍了如何忽略以特定后缀结尾的所有文件。如果您想要做一个例外,并且有一个带有该后缀的文件不想忽略,会发生什么情况呢?
假设你在.gitignore文件中添加了以下内容:
.md
该模式忽略所有以.md结尾的文件,但您不希望Git忽略README.md文件。
要做到这一点,您需要使用带有感叹号的否定模式,!,来使该文件失效,否则该文件将会被忽略:
ignores all .md files
.md
does not ignore the README.md file
!README.md
对于.gitignore文件中的这两种模式,所有以.md结尾的文件都会被忽略,除了README.md文件。
要注意的是,如果忽略整个目录,此模式将不起作用。
假设你忽略了所有的测试目录:
test/
假设在一个测试文件夹中,有一个文件,例如.Md,你不想忽视的。
你不能像这样对一个被忽略的目录中的文件进行否定:
ignore all directories with the name test
test/
trying to negate a file inside an ignored directory won’t work
!test/example.md
最好的做法是创建一个.gitignore文件,其中包含创建新存储库时要忽略的所有文件和不同的文件模式——在提交之前。
Git只能忽略尚未提交到存储库的未跟踪文件。
如果您在过去已经提交了一个文件,但希望没有提交该怎么办?
假设您不小心提交了一个存储环境变量的.env文件。
你首先需要更新.gitignore文件以包含.env文件:
add .env file to .gitignore
echo ".env" >> .gitignore
现在,你需要告诉Git不要跟踪这个文件,把它从索引中删除(如果是文件夹需要添加-r选项):
git rm --cached .env
git rm命令和–cached选项一起从存储库中删除文件,但不删除实际的文件。这意味着该文件作为一个被忽略的文件保留在您的本地系统和工作目录中。
git status将显示该文件已不在存储库中,而输入ls命令将显示该文件存在于本地文件系统中。
如果希望从存储库和本地系统中删除文件,请忽略–cached选项。
接下来,使用git add命令将.gitignore添加到暂存区:
git add .gitignore
最后,使用git commit命令提交.gitignore文件:
git commit -m "update ignored files"
福利:
提交代码忽略配置文件
git update-index --assume-unchanged src/main/resources/application.properties
取消忽略配置文件
git update-index --no-assume-unchanged src/main/resources/application.properties
现在您已经知道了忽略Git中的文件和文件夹的基本知识。
希望本文对您有所帮助。
结语
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。