1. 日常开发现状
我们平时在使用 git 来管理项目代码时,经常使用的 一条命令是:
1 | git add . |
表示将当前 workspace(工作区)的所有修改添加到 stage(暂存区)。
这条命令使用起来非常方便,因为我们不需要将待添加到 stage 的文件一个个列出来。但是它也有一个不好的地方,就是当前 workspace 里面的所有文件,包括自动生成的文件、配置文件、编辑器产生的文件、操作系统生成的文件、二进制文件等,通通都被添加到 stage,后面随着 git commit
被添加到 repository(仓库)。
但是这些文件和我们的 source code(源代码)丝毫没有关系,我们不关心它们的变动。所以我们想要有某种机制,能够不跟踪这些文件的变化。
.gitignore
文件就是帮我们实现这个的。
2. 使用方法
2.1 不想跟踪的文件不在仓库里
首先考虑第一种场景,我们项目刚刚开始,还没有做 commit,或者说过往的所有 commit 里,没有将那些我们不想要跟踪的文件提交到 repository。
这种情况比较处理比较简单:在项目的根目录下面,添加一个 .gitignore
文件,这样后面我们 git add
的时候,就不会将 .gitignore
中定义的文件类型、目录类型,添加到 stage,也就不会添加到 repository。
.gitignore
文件的每一行表示一种文件类型,或者一种目录类型,常见写法有如下几种,参考这里
1 | ignore all .a files |
还有一个非常使用的网站可以帮我们生成 .gitignore
文件模板,而不需要我们手动去一行一行编写。
举个例子,我们的项目是用 Python 编写的,在 macOS 平台测试的,使用的编辑器是 vscode,IDE 是 pycharm,那么我们就可以在输入框中依次输入 Python
macOS
vscode
Pycharm
几个关键字,这个网站就会自动生成一个 .gitignore
文件模块,我们直接使用就行了。
如果项目中还有一些文件或者目录不想让 git 跟踪的,也可以在 .gitignore
里面继续添加规则。
2.2 不想跟踪的文件已经提交到仓库里
这种情况其实在实际开发中更常见一点,就是我们之前的某次 commit 已经将某种类型的文件或者目录提交到本地的 repository 中了,但是现在我们发现,我们并不想让 git 来跟踪这类文件。
这时候,通过在项目根目录下添加 .gitignore
文件的方式并不管用,因为我们添加 .gitignore
之后,接着 git add
,还是会跟踪这些不想跟踪的类型文件。
- 如果不想跟踪的只有某几个文件,可以这么办。首先将所有的已经做的改动提交一次 commit,直到我们使用
git status
的结果是working tree clean
。
然后在命令行中输入:
1 | git rm --cached <file_name1> <file_name2> |
接着再:
1 | git add . |
这时候,因为有 .gitignore
的缘故,我们的 <file_name1>
, <file_name2>
就不会被添加到 stage 了,最后我们再:
1 | git commit -m "your commit message" |
就可以将当前修改提交到 repository 里面了,repository 中不会包含 <file_name1>
和 <file_name2>
。
- 如果不想跟踪的文件是某种类型的文件,非常多,没办法一一罗列,那么可以用一种比较暴力的方式。
首先,和之前一样,保证当前的 working tree clearn
,这样不会让自己丢失掉任何已经在 workspace 中做过的修改。然后在命令行中执行:
1 | git rm -r --cached . |
上面命令的作用是将 repository 中的所有文件全部删除。
接着再执行:
1 | git add . |
由于有 .gitignore
文件,不想提交的文件类型不会被提交到 stage 中。
最后我们再:
1 | git commit -m "your commit message" |
这样就完成任务了!