切换Git分支时,被.DS_Store卡了好一会,不开心。
分享下最佳实践:
1、在创建项目时,就把.DS_Store加入.gitignore。
2、把.DS_Store添加到全局.gitignore
的数字化之路
格物致知 知行合一 记录开悟时的小欢喜 也希望能通过这种方式正向反馈社区
191篇原创内容
公众号
切Git分支时报错了:
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中。
怎么解决:
创建或编辑项目根目录下的 .gitignore 文件,添加以下内容:
# 忽略macOS系统文件
.DS_Store
然后执行:
git add .gitignore
git commit -m "添加DS_Store到忽略列表"
如果这些文件之前被错误地提交过,需要从版本控制中移除(但保留本地文件):
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时遇到的错误。
%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
如果你确定不需要这些文件,可以直接删除:
find . -name '.DS_Store' -type f -delete
为避免未来所有项目出现类似问题,可配置全局.gitignore:
# 创建全局gitignore文件
touch ~/.gitignore_global
echo '.DS_Store' >> ~/.gitignore_global
# 配置Git使用该文件,这一步一定要有,不然不生效
git config --global core.excludesfile ~/.gitignore_global
测试是否生效:
执行命令
git config --global core.excludesfile
如果输出结果是配置的那个文件,则说明有全局.gitignore文件。没有,则说明没有。
完成上述步骤后,你的项目将正确忽略.DS_Store 文件。此时再查看状态:
git status
应该不再显示这些文件。如果还有其他未跟踪文件,请根据实际需求决定是否添加到版本控制中。
这才哪到哪呢。还有报错。
把当前分支merge到其它分支时,会报下面的错:
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
Unmerged paths:
(use "git add/rm <file>..." as appropriate to mark resolution)
deleted by them: ../.DS_Store
.DS_Store
文件在另一个分支(可能是远程分支)中被删除了,但在你当前的分支中却存在这个文件。.gitignore
变更: 你在 .gitignore
里添加了 .DS_Store
,不过这个文件已经处于 Git 的跟踪之下,所以 .gitignore
对它不起作用。你可以按照以下步骤解决这个冲突:
.DS_Store
git rm --cached ../.DS_Store # 从版本控制中移除(保留本地文件)
git add ../.DS_Store # 标记冲突已解决# 查看状态确认
再检查下:
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 检测到以下情况:
.DS_Store
文件被修改且未提交(可能是系统自动更新了该文件)。.DS_Store
文件,导致本地修改丢失。什么是.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 是 macOS 自动生成的隐藏文件,用于存储文件夹的显示设置。它通常不应该被纳入版本控制,因为:
.gitignore 的生效时机?
只有新文件才会受到 .gitignore 规则的影响。
对于已经被跟踪的文件,需要先使用 git rm --cached 将其从版本控制中移除,之后 .gitignore 才能对其起作用。
为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 分支模式?