Git全局递归忽略.DS_Store

Mac下,只要在Finder访问过的文件夹,都会生成一个.DS_Store的文件,Mac用它来存储当前文件夹的一些Meta信息。对于Git来说,不经意间总是会干扰到其他正常的提交和本地仓库状态,是很烦恼,找了半天,终于有一个比较好的办法处理了

流程大致是这样的:

对于项目内已经提交了.DS_Store到仓库的情况

1
find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

搜索一下项目内所有的.DS_Store,全部rm掉,然后再push一把

对于今后的项目,做全局的配置

如果没有~/. gitignore_global文件,echo也会为你生成一个,这里的主要目的是覆盖所有可能的OS X版本生成的.DS_Store,逐一执行一次就可以了,之后cat一下看是否正常写入了

1
2
3
4
echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global

然后设置一下全局的配置

1
git config --global core.excludesfile ~/.gitignore_global

大功告成~

另外,Github还提供了一个官方的全局示例,可以根据实际需求使用:

最后补充一下.gitignore的语法

gitignore规范

  • 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上(!)取反。

glob模式要点

  • *:任意个任意字符,
  • []:匹配任何一个在方括号中的字符,
  • ?:匹配一个任意字符,
  • [0-9]:匹配字符范围内所有字符