Git中文社区

忽略文件

项目中总有一些文件不需要纳入版本控制,比如依赖包、编译产物、日志、本地配置和密钥。通过 .gitignore 文件,可以告诉 Git 忽略它们。

创建 .gitignore

在仓库根目录创建名为 .gitignore 的文件,每行写一个匹配规则:

# 依赖目录
node_modules/

# 构建产物
dist/
build/
*.class

# 日志
*.log
logs/

# 系统文件
.DS_Store
Thumbs.db

# 编辑器配置
.idea/
.vscode/*
!.vscode/extensions.json

# 环境变量与密钥
.env
.env.local
*.pem

.gitignore 本身应该提交到仓库,这样团队所有成员都会使用相同的忽略规则。

匹配规则

规则含义
# 开头注释
*.log忽略所有 .log 文件
temp/忽略任意位置的 temp 目录
/temp只忽略根目录下的 temp,不包括 src/temp
doc/*.txt忽略 doc/notes.txt,但不包括 doc/server/arch.txt
doc/**/*.pdf忽略 doc/ 下所有层级的 .pdf 文件
!important.log取反:不忽略该文件
?匹配任意单个字符
[abc]匹配方括号中的任意一个字符

注意

如果某个目录已经被忽略,则无法用 ! 重新包含该目录下的文件。例如忽略了 build/,再写 !build/keep.txt 是无效的,应改为 build/* 再加 !build/keep.txt。

已经被跟踪的文件怎么办

.gitignore 只对未跟踪的文件生效。如果文件已经提交过,加入 .gitignore 后 Git 仍会继续跟踪它。需要先停止跟踪:

# 停止跟踪单个文件(保留本地文件)
git rm --cached .env

# 停止跟踪整个目录
git rm -r --cached node_modules

git commit -m "停止跟踪 node_modules"

警告

如果密钥或密码已经被推送到公共仓库,只删除文件没有用,它仍然存在于历史中。请立即更换该密钥,并考虑使用 git filter-repo 清除历史。

检查忽略规则

某个文件为什么被忽略了?用 check-ignore 查看是哪条规则生效:

git check-ignore -v debug.log
# .gitignore:9:*.log    debug.log

列出所有被忽略的文件:

git status --ignored

全局忽略

有些文件与项目无关,而与你的操作系统或编辑器有关(比如 .DS_Store)。可以配置一个全局的忽略文件,对所有仓库生效:

git config --global core.excludesFile ~/.gitignore_global

然后在 ~/.gitignore_global 中写入规则即可。

仅本地忽略

如果只想在自己的本地仓库忽略某些文件,而不影响他人,可以写到 .git/info/exclude 中,格式与 .gitignore 相同。

常用模板

GitHub 维护了一个包含各种语言和框架的 .gitignore 模板仓库。可以用本站的 .gitignore 生成 按语言和编辑器勾选,拼成一份规则。

保留空目录

Git 只跟踪文件,不跟踪空目录。如果需要在仓库中保留一个空目录,惯例是在其中放一个 .gitkeep 空文件:

touch uploads/.gitkeep