使用.gitignore来忽略一些不想提交的文件

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ignore all .a files
*.a

# but do track lib.a, even though you're ignoring .a files above
!lib.a

# only ignore the TODO file in the current directory, not subdir/TODO
/TODO

# ignore all files in any directory named build
build/

# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt

# ignore all .pdf files in the doc/ directory and any of its subdirectories
doc/**/*.pdf

还有一个非常使用的网站可以帮我们生成 .gitignore 文件模板,而不需要我们手动去一行一行编写。

地址:https://www.gitignore.io/

举个例子,我们的项目是用 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"

这样就完成任务了!

3. References

Donate comment here