如果你是 macOS 用户并且使用 Git,那么你肯定在 git status 中见过这个令人困惑的文件——.DS_Store。它总是莫名其妙地出现,污染你的提交记录,让提交信息变得混乱。本文将深入探讨这个文件是什么,为什么它会“纠缠”Git,以及如何一劳永逸地解决这个问题。
.DS_Store 到底是什么?
.DS_Store(Desktop Services Store)是 macOS 系统自动生成的隐藏文件,它的本职工作是存储其所在文件夹的视图元数据,例如:
- 图标的位置和排列顺序
- 背景图片(如果设置了的话)
- 视图显示方式(图标、列表、分栏、画廊)
- 窗口大小和滚动条位置
- 排序方式(按名称、日期、种类等)
简单来说,它是 Finder 的“记忆芯片”,确保你每次打开文件夹时,一切都和你离开时一样。它在 macOS 系统内是完全无害且有用的。
为什么它在 Git 中成了“问题”?
尽管在本地没问题,但在跨平台和版本控制场景下,.DS_Store 会带来麻烦:
- 污染 Git 仓库:它和你项目的源代码毫无关系,将其提交到仓库中是一种污染,使提交历史变得不专业且混乱。
- 跨平台共享时杂乱:当你将文件夹共享给 Windows 或 Linux 用户时,这些原本隐藏的文件会变得可见,造成困扰。
- 潜在的安全风险:如果被意外部署到服务器上,理论上可能泄露目录结构信息。
解决问题的核心:.gitignore
解决方案的核心是使用 .gitignore 文件。这个文件告诉 Git explicitly 忽略哪些文件或模式。
项目级解决方案(推荐)
每个项目都应该有自己的 .gitignore 文件。
-
创建或编辑
.gitignore文件: 在你的项目根目录下,如果还没有.gitignore文件,就创建一个。然后在其中添加一行:# 忽略所有 .DS_Store 文件 .DS_Store -
提交这个更改:
.gitignore文件本身是需要被版本控制的,这样所有协作者都能共享同样的忽略规则。git add .gitignore git commit -m "Add .gitignore to exclude system files like .DS_Store"
全局级解决方案(一劳永逸)
为你电脑上的所有 Git 仓库设置全局忽略规则,避免为每个新项目重复操作。
-
创建全局忽略文件: 在终端中执行以下命令:
echo ".DS_Store" >> ~/.gitignore_global # 你还可以添加其他全局忽略项,例如: echo ".AppleDouble" >> ~/.gitignore_global echo ".LSOverride" >> ~/.gitignore_global echo "Thumbs.db" >> ~/.gitignore_global -
配置 Git 使用此文件:
git config --global core.excludesfile ~/.gitignore_global
现在,所有新的仓库都会自动忽略 .DS_Store 文件。
关键一步:清理已跟踪的 .DS_Store
这是最多人踩坑的地方! .gitignore 只对未被跟踪(untracked) 的文件生效。如果你的 .DS_Store 文件已经在之前的某次提交中被 git add 过,那么它已经被“跟踪”了,.gitignore 规则对它将不再生效。
这就是为什么你的 .gitignore 规则明明正确,却依然看到 git status 提示有 .DS_Store 变更。
解决方法是从 Git 索引中删除它们,但保留本地文件:
# 递归地从所有子目录中移除 .DS_Store 的跟踪,但保留本地文件
git rm --cached **/.DS_Store
# 如果上述命令不工作,可以使用 find 命令
# find . -name ".DS_Store" -exec git rm --cached {} \;
# 提交这次清理操作
git commit -m "chore: Remove existing .DS_Store files from repository tracking"
这个 git rm --cached 命令是解决问题的钥匙。它告诉 Git:“停止跟踪这个文件,但别动我电脑上的原文件。”
然后就不会再被git记录了

最佳实践
- 双管齐下:既配置全局忽略规则,也为重要项目配置项目自身的
.gitignore。 - 优先创建.gitignore:在项目一开始就创建好
.gitignore文件,避免问题发生。 - 清理后再推送:在将清理提交推送到远程仓库(如 GitHub)之前,确保所有协作者都已完成清理,以避免合并冲突。
从此以后,你的 Git 仓库将变得干净整洁,.DS_Store 将再也无法打扰你的版本控制工作流。
在 GitHub's gitignore templates 找到各种语言和框架的官方 .gitignore 模板,它们一般也通常已经包含了忽略 .DS_Store 的规则。
比如nextjs的gitnore模版: