如何从Git仓库中删除.DS_Store文件?

1727

如何从 Git 仓库中删除那些令人烦恼的 Mac OS X .DS_Store 文件?


7
请查看:http://www.aorensoftware.com/blog/2011/12/24/death-to-ds_store/ - kenorb
这在许多版本的 MacOS 中都是一样的,不仅仅是 Mac OS X。 - Jim Aho
32个回答

3356

从代码库中删除现有的.DS_Store文件:

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

添加这一行:

.DS_Store

.gitignore文件添加到您的存储库顶层(如果不存在则创建该文件)。您可以使用以下命令轻松完成此操作:

cd top-directory
touch .gitignore
echo .DS_Store >> .gitignore

然后将文件提交到代码库:

git add .gitignore
git commit -m '.DS_Store banished!'

18
这很琐碎,但是使用“-exec”会为每个.DS_Store文件启动一次“git-rm”,而“xargs”会将所有路径放在一个命令行上。通常我更喜欢“xargs”,因为我不必担心转义大量特殊字符。 - benzado
10
应该使用.git/info/exclude而不是.gitignore。参见https://dev59.com/D3I-5IYBdhLWcg3woKBJ#1753078以了解这两者之间的区别。 - Andrew Grimm
122
@Andrew: 我不同意。将 .DS_Store 文件加入版本控制是没有用的,所以更合理的做法是将其设置为适用于整个代码库且所有用户都生效的选项,而不是需要每个 Mac 用户自己记得去设置。 - benzado
73
.DS_Store添加到.gitignore文件中是否具有递归效果?也就是说,它是否会忽略some/level/of/folders/.DS_Store这样的文件? - Charlie Schliesser
90
是的,如果该模式不包含斜杠,则将其与所有目录中的文件名进行匹配。 - benzado
显示剩余24条评论

281

综合benzado和webmat的回答,结合git rm的更新,不会因为找到非存储库中的文件而失败,并使其在任何用户处都可以粘贴:

# remove any existing files from the repo, skipping over ones not in repo
find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
# specify a global exclusion list
git config --global core.excludesfile ~/.gitignore
# adding .DS_Store to that list
echo .DS_Store >> ~/.gitignore

3
在我的主目录中使用 Git 仓库(也称为“点文件”仓库)时,我发现将 ~/.gitignore 作为全局排除文件会很麻烦。有些文件我想从主目录中排除,但又不希望全局忽略它们。因此,我使用同样的指令 core.excludesfile,而是使用 ~/.gitexcludes - AL the X

212
解决这个问题的最佳方法是在系统上从所有git仓库中全局忽略这些文件。可以通过创建一个全局gitignore文件来实现,例如:
vi ~/.gitignore_global

增加忽略文件的规则,例如:

# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so

# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# Logs and databases #
######################
*.log
*.sql
*.sqlite

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

现在,请将此文件添加到您的全局 git 配置中:

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

编辑:

移除图标,因为它们可能需要作为应用程序资源提交。


您还可以将上述规则添加到存储库的 .gitignore 文件中。如果有多个贡献者参与您的项目,这将在存储库级别上防止这些文件出现。但是,在这种情况下,.gitignore 应该处理每个操作系统特定的文件等,如果不同的开发人员使用不同的操作系统。例如,针对 Linux、OSX 等的规则。 - Nerve
4
我建议每个开发者在自己的 .global_ignore 文件中处理其特定于操作系统的文件,这样项目的 .gitignore 文件就可以针对项目进行设置。 - mcfedr
必须运行命令:git add .gitignore_global,以便其他程序员也可以在他们的本地环境中使用该文件。 - stackdave
作为一个新手,我发现这是一个非常棒的资源,但我想知道是否有视频或文章可以让我了解为什么文件类型通常被忽略的原因。提前感谢! - timSully
非常棒的解决方案,谢谢。 - DimiDak
显示剩余2条评论

66

在某些情况下,您可能还希望全局忽略一些文件。对我来说,.DS_Store就是其中之一。以下是方法:

git config --global core.excludesfile /Users/mat/.gitignore

(或者选择任何文件)

然后像编辑存储库的.gitignore一样编辑该文件。请注意,我认为您必须使用绝对路径。


50

如果由于有已暂存的更改而无法删除文件,请使用:

git rm --cached -f *.DS_Store

2
对我来说,这个方法可行:git rm --cached -f .DS_Store - Pei

49
有时候,.DS_Store文件可能存在于远程代码库中,但在本地项目文件夹中却看不到。要解决这个问题,我们需要移除所有缓存文件并重新添加。

步骤1:将以下内容添加到.gitignore文件中。

# Ignore Mac DS_Store files
.DS_Store
**/.DS_Store

步骤2:使用以下命令删除缓存文件并重新添加。

git rm -r --cached .
git add .
git commit -am "Removed git ignored files"
git push -f origin master

4
实际上不需要 **/.DS_Store 这行,只添加 .DS_Store 就可以了。 - Can

42

最好的方法是永久性地摆脱这个文件:

创建一个全局的.gitignore文件:

echo .DS_Store >> ~/.gitignore_global

告诉 Git 你想在所有仓库中使用此文件:

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

就是这样!.DS_Store将在所有存储库中被忽略。


这很棒,因为它会影响所有的 repos,而且我甚至不需要更改 repo 的 .gitignore 文件(这样可以省去一个 pull request)。 - Rayee Roded

30

最高得票的答案很棒,但是像我这样的菜鸟需要帮助。下面是如何创建.gitignore文件、编辑、保存、删除你可能已经添加到git的文件,并将文件推送到Github。

创建.gitignore文件

要创建.gitignore文件,只需使用touch命令创建一个指定名称的空白文件。我们想创建名为.gitignore的文件,所以可以使用以下命令:

touch .gitignore

忽略文件

现在,您必须将告诉git忽略DS Store文件的行添加到.gitignore中。您可以使用nano编辑器完成此操作。

nano .gitignore

Nano非常好用,因为它包含有关如何退出的说明。(按Ctrl-O保存,按Ctrl-X退出)

从此Github gist复制并粘贴一些常见忽略文件的想法。回答这个问题最重要的是:

# OS generated files #
######################
.DS_Store
.DS_Store?

# 这里的 # 是注释,可以帮助您在文件逐渐增大时进行组织。

# 这篇Github文章也有一些通用的想法和指南。

# 从已添加到git的文件中删除

# 最后,您需要实际从目录中删除那些DS Store文件。

# 使用这个最有票数的答案中的伟大命令。它将遍历目录中的所有文件夹,并从git中删除这些文件。

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

# 将.gitignore推送到Github上

# 最后一步,您需要实际提交您的.gitignore文件。

git status

git add .gitignore

git commit -m '.DS_Store banished!'


5
你的步骤中的touch命令是不必要的……nano会为你创建该文件。 - Corey Goldberg
12
两年后我找到了自己的答案并使用了它。过去的我干得好。 :) - Joshua Dance
1
完美地工作了!!谢谢 - iUser

26

打开终端并输入 "cd < ProjectPath >"。

  1. 删除现有文件: find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

  2. nano .gitignore

  3. 添加此内容 .DS_Store

  4. 输入 "ctrl + x"

  5. 输入 "y"

  6. 按 Enter 保存文件

  7. git add .gitignore

  8. git commit -m '.DS_Store removed.'


nano .gitignore 如果文件不存在则创建该文件,该命令应从项目根目录执行。 - Saif
1
@Saif 不一定。您可以在任何想要排除某些子目录中的文件而不包括根目录的目录中使用.gitignore。例如,我在我的许多仓库中都有这个。 - Pryftan

19

我必须将上述命令中的"git-rm"更改为"git rm"才能使其正常工作:

find . -depth -name '.DS_Store' -exec git rm --cached '{}' \; -print

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接