首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.DS_Store 叛乱记:当 Git 被小小系统文件逼到墙角,如何优雅平叛?

.DS_Store 叛乱记:当 Git 被小小系统文件逼到墙角,如何优雅平叛?

作者头像
烟雨平生
发布2025-07-10 09:50:51
发布2025-07-10 09:50:51
18300
代码可运行
举报
文章被收录于专栏:数字化之路数字化之路
运行总次数:0
代码可运行

切换Git分支时,被.DS_Store卡了好一会,不开心。

分享下最佳实践:

1、在创建项目时,就把.DS_Store加入.gitignore。

2、把.DS_Store添加到全局.gitignore

的数字化之路

格物致知 知行合一 记录开悟时的小欢喜 也希望能通过这种方式正向反馈社区

191篇原创内容

公众号

切Git分支时报错了:

代码语言:javascript
代码运行次数:0
运行
复制
Your local changes to the following files would be overwritten by checkout: 
.DS_Store Please commit your changes or stash them before you switch branches. 
Aborting

有这个报错,说明git checkout失败了,说明.DS_Store没有在.gitignore中。

怎么解决:

1. 忽略所有.DS_Store 文件

创建或编辑项目根目录下的 .gitignore 文件,添加以下内容:

代码语言:javascript
代码运行次数:0
运行
复制
# 忽略macOS系统文件
.DS_Store

然后执行:

代码语言:javascript
代码运行次数:0
运行
复制
git add .gitignore
git commit -m "添加DS_Store到忽略列表"

2. 清除已跟踪的.DS_Store 文件

如果这些文件之前被错误地提交过,需要从版本控制中移除(但保留本地文件):

代码语言:javascript
代码运行次数:0
运行
复制
git rm --cached $(git ls-files -i -o --exclude-from=.gitignore | grep .DS_Store$)
git commit -m "移除已跟踪的DS_Store文件"

git rm --cached: 此命令的作用是将文件从版本控制中移除,但会保留本地文件。

命令参数说明

  • -i 选项的作用是只显示那些符合忽略规则的文件。
  • -o 选项表示只显示未跟踪的文件。
  • -r 选项用于递归删除目录。

执行git rm --cached命令时,出现如下的报错时,说明你的Git项目是优秀的,不会出现楼主checkout时遇到的错误。

代码语言:javascript
代码运行次数:0
运行
复制
%git rm --cached -r $(git ls-files -i -o --exclude-from=.gitignore | grep .DS_Store)
fatal: pathspec 'target/.DS_Store' did not match any files

3. 清理本地未跟踪的.DS_Store

如果你确定不需要这些文件,可以直接删除:

代码语言:javascript
代码运行次数:0
运行
复制
find . -name '.DS_Store' -type f -delete

4. 全局忽略.DS_Store

为避免未来所有项目出现类似问题,可配置全局.gitignore:

代码语言:javascript
代码运行次数:0
运行
复制
# 创建全局gitignore文件
touch ~/.gitignore_global
echo '.DS_Store' >> ~/.gitignore_global

# 配置Git使用该文件,这一步一定要有,不然不生效
git config --global core.excludesfile ~/.gitignore_global

测试是否生效:

执行命令

代码语言:javascript
代码运行次数:0
运行
复制
git config --global core.excludesfile

如果输出结果是配置的那个文件,则说明有全局.gitignore文件。没有,则说明没有。

最终检查

完成上述步骤后,你的项目将正确忽略.DS_Store 文件。此时再查看状态:

代码语言:javascript
代码运行次数:0
运行
复制
git status

应该不再显示这些文件。如果还有其他未跟踪文件,请根据实际需求决定是否添加到版本控制中。

这才哪到哪呢。还有报错。

把当前分支merge到其它分支时,会报下面的错:

代码语言:javascript
代码运行次数:0
运行
复制
0 file committed, 15 files failed to commit: 
chore: 更新文件权限并忽略 .DS_Store 文件  
- 修改了多个 Java 文件的权限 
- 在 .gitignore 文件中添加了 .DS_Store 文件的忽略项 
Committing is not possible because you have unmerged files.

怎么办?关键是IDEA上并没有显示有文件unmerged!!!

只能上命令了:

git status

代码语言:javascript
代码运行次数:0
运行
复制
Unmerged paths:
  (use "git add/rm <file>..." as appropriate to mark resolution)
        deleted by them: ../.DS_Store

冲突原因分析

  • deleted by them.DS_Store 文件在另一个分支(可能是远程分支)中被删除了,但在你当前的分支中却存在这个文件。
  • .gitignore 变更: 你在 .gitignore 里添加了 .DS_Store,不过这个文件已经处于 Git 的跟踪之下,所以 .gitignore 对它不起作用。

解决方案

你可以按照以下步骤解决这个冲突:

移除已被删除的 .DS_Store
代码语言:javascript
代码运行次数:0
运行
复制
git rm --cached ../.DS_Store  # 从版本控制中移除(保留本地文件)
git add ../.DS_Store          # 标记冲突已解决# 查看状态确认

再检查下:

代码语言:javascript
代码运行次数:0
运行
复制
git status  # 应该显示 "nothing to commit, working tree clean"

在目标分支上重新提交代码就ok了。

你看少了一项小小的Git .gitignore配置,生出多少事,耽误了多少时间

小结

本文详细阐述了因 macOS 系统文件 .DS_Store 未被正确忽略而导致的 Git 分支切换 (checkout) 失败问题及其连锁反应(合并冲突)。核心解决方案分四步:

  • 忽略规则: 确保项目 .gitignore 和全局 ~/.gitignore_global 包含 .DS_Store
  • 清理追踪: 使用 git rm --cached 移除已被 Git 错误追踪的 .DS_Store 文件(保留本地)。
  • 清除本地: 用 find 命令安全删除本地不需要的 .DS_Store
  • 解决冲突: 当合并因 deleted by them 状态的 .DS_Store 冲突时,需手动 git rm --cached 该冲突文件标记解决。文章强调了正确配置 .gitignore 的重要性及由此引发的 Git 操作复杂性。

这是个什么错?为什么会报这个错:

这个错误是 Git 在你切换分支时出现的保护机制,具体原因和解决方案如下:

为什么会出现这个错误?

当你尝试切换分支(如执行 git checkout another-branch)时,Git 检测到以下情况:

  1. 当前分支有未提交的修改.DS_Store 文件被修改且未提交(可能是系统自动更新了该文件)。
  2. 目标分支上同名文件的内容不同切换到目标分支会覆盖当前的 .DS_Store 文件,导致本地修改丢失。
  3. Git 的保护机制为避免意外丢失数据,Git 强制你先处理这些修改(提交或暂存)。

什么是.DS_Store文件?为什么是 .DS_Store冲突?

.DS_Store (Desktop Services Store) 是一种由苹果公司的 Mac OS X 操作系统所创造的隐藏文件,目的在于存贮目录的自定义属性,例如文件们的图标位置或者是背景色的选择,相当于Windows下的desktop.ini。

为什么是 .DS_Store冲突?

每个开发者的 macOS 系统可能生成不同的 .DS_Store内容。版本库中存储 .DS_Store会导致频繁冲突。

.DS_Store文件通常不需要纳入版本控制。

为什么要忽略.DS_Store?

.DS_Store 是 macOS 自动生成的隐藏文件,用于存储文件夹的显示设置。它通常不应该被纳入版本控制,因为:

  • 它是特定于单个开发者的本地配置
  • 可能导致不同开发者之间的合并冲突
  • 对项目本身没有实际价值

.gitignore 的生效时机?

只有新文件才会受到 .gitignore 规则的影响。

对于已经被跟踪的文件,需要先使用 git rm --cached 将其从版本控制中移除,之后 .gitignore 才能对其起作用。

在gitee.com上新建个项目,居然push不了,阿西吧

为commit自定义Author 场景一:全局级别。设置全局用户名和电子邮件地址。 git config --global user.name "YourName" git config --global user.email "your.email@ai-as.cn" 场景二:项目级别。不同的仓库的user.name和user.email是不同的 2.1 cd 到Git仓库所在文件夹目录【很关键】 2.2 执行以下git config命令 git config user.name "YourName" git config user.email "yourEmail@ai-as.net" 唐成,公众号:的数字化之路分享Git的两个小技巧

使用“--depth=1”参数,只clone最后一次commit,会不会导致clone下来的仓库文件出现丢失的问题? 唐成,公众号:的数字化之路使用git depth为CI提速

分支的目的是隔离,但多一个分支也意味着维护成本的增加。 张燎原,公众号:生活点亮技术如何选择 Git 分支模式?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 忽略所有.DS_Store 文件
  • 2. 清除已跟踪的.DS_Store 文件
  • 命令参数说明
  • 3. 清理本地未跟踪的.DS_Store
  • 4. 全局忽略.DS_Store
  • 最终检查
  • 冲突原因分析
  • 解决方案
    • 移除已被删除的 .DS_Store
  • 为什么会出现这个错误?
  • 为什么要忽略.DS_Store?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档