.gitignore删除每个文件夹和子文件夹中的所有.DS_Store文件


558

我已将.DS_Store添加到.gitignore文件中,但似乎它只是忽略根目录中的.DS_Store,而不是忽略每个文件夹和子文件夹中的.DS_Store。

我该如何解决?



您究竟如何将其添加到.gitignore?它应该在所有目录中都可以工作(对我来说有用)。
Thilo

它也为我工作。我还尝试了在文件末尾使用它,如果您必须使用(特定于平台的)换行符,但这并没有改变,则层次结构任何部分中的.DS_Store目录仍然被忽略。
enorl76

据我了解,问题是:如何轻松地忽略所有子目录中所有出现的.DS_Store,而无需在每个子目录中手动进行。我有同样的问题。下面的答案显示了如何解决它(最后两段)。
petrsyn

Answers:


644

我认为您遇到的问题是,在较早的提交中,您不小心将.DS_Store文件添加到了存储库中。当然,一旦在存储库中跟踪了文件,即使它与适用的.gitignore文件中的条目匹配,也将继续对其进行跟踪。

您必须手动删除添加到存储库中的.DS_Store文件。您可以使用git rm --cached .DS_Store。一旦删除,git应该忽略它。您只需要在根.gitignore文件中包含以下行:.DS_Store。不要忘记时期!

git rm --cached .DS_Store仅从.DS_Store当前目录中删除。您可以用来从存储库中find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch删除所有内容.DS_Stores

提示:由于您可能永远不想包含.DS_Store文件,因此请制定全局规则。首先,在某个位置创建一个全局.gitignore文件,例如echo .DS_Store >> ~/.gitignore_global。现在,告诉git将其用于所有存储库:git config --global core.excludesfile ~/.gitignore_global

此页面帮助我回答了您的问题:https : //help.github.com/articles/ignoring-files


41
最后两段回答了这个问题。谢谢。
petrsyn

70
“ git rm --cached .DS_Store”从当前目录中仅删除一个.DS_Store。使用“´find”。名称.DS_Store -print0 | xargs -0 git rm --ignore-unmatch´´从回购中删除所有.DS_Stores
auco 2014年

4
其他常见文件列表可能会很方便
地理理论

14
使用全局规则IMO的坏主意:试图在多个用户/机器之间维护全局配置永远行不通-您希望规则可以在仓库本身中管理仓库。对此表示同意
Yarin 2015年

15
我不同意你的看法。(即使我赞成您的评论,因为我认为它很有见地。)如果我们进行全球性开发,则每个mac用户都需要这样做,但只需这样做一次。如果我们在整个存储库中进行存储,那么我们需要对每个存储库都这样做。我不认识你,但是我一直都在做新的回购。通过在全球范围内进行,一劳永逸地解决了问题。
爱德华·纽厄尔

354

添加**/.DS_Store.gitignore子目录


如果.DS_Store已经提交:

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

要在所有存储库中忽略它们:(有时命名为._.DS_Store

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

仍上传到我的仓库中?
Freddy Sidauruk '16

@FreddySidauruk git rm --cached your_file首先使用
ronald8192 '16

@FreddySidauruk应该是find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch从:stackoverflow.com/questions/18393498/...
ronald8192

1
-f如果您在relavent文件夹中打开了文件,则似乎需要添加:find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Mehmet Kaplan,

157

如果.DS_Store从未添加到git存储库,只需将其添加到.gitignore文件即可。

如果您没有,请创建一个名为

.gitignore

在您应用的根目录中,只需编写

**/.DS_Store

在里面。这将永远不允许.DS_Store文件潜入您的git中。

但是,如果已经存在,请在您的终端中输入:

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

然后提交并推送更改以从远程仓库中删除.DS_Store:

git commit -m "Remove .DS_Store from everywhere"

git push origin master

现在,将.DS_Store添加到您的.gitignore文件中,然后再次提交并推送最后2条代码(git commit ...,git push ...)


3
为什么要使用双星号?这意味着什么?
MilanG

1
@MilanG这是一个关键字,基本上意味着“在此目录和所有子目录中搜索”。
lachie_h

1
不确定这是双星号代表的完美解释。这是一个通配符。可能*还是**取决于您要实现的目标。这是一种告诉Shell如何导航目录的方法。这个stackoverflow答案完全说明了stackoverflow.com/a/28199633/4092170
El'Magnifico

**永远不会匹配隐藏的(./)目录:facelessuser.github.io/wcmatch/glob
Jonathan

这实际上有效...应该标记为已回答
ichimaru

85

您的.gitignore文件应如下所示:

# Ignore Mac DS_Store files
.DS_Store

只要不包含斜杠,它就会与所有目录中的文件名匹配。(从这里开始


它仍然受到回购的追捧
Freddy Sidauruk '16

@FreddySidauruk,那么您必须运行git rm --cached path/to/file/here
Sgnl

23

步骤1,删除所有*.DS_store文件。一个可以跑

git rm -f *.DS_Store

但请注意,rm -f如果有错字,可能会有些危险!第二步:添加

*.DS_Store
.DS_Store

.gitignore。这对我有用!


13

添加*.DS_Store到您的.gitignore文件。完美地适合我


11

您还可以将--cached标志添加到auco的答案中,以维护本地.DS_store文件,如Edward Newell在其原始答案中所述。修改后的命令如下所示:find . -name .DS_Store -print0 | xargs -0 git rm --cached --ignore-unmatch..干杯,谢谢!


5

步骤:1)使用此命令删除现有文件

找 。名称.DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

步骤:2)在您的.gitignore文件中添加.DS_Store

步骤:3)在.gitignore中提交更改git add .gitignore git commit -m“已删除.DS_Store”


3
  1. $ git rm ./*.DS_Store -从git中删除所有.DS_Store
  2. $ echo \.DS_Store >> .gitignore -以后忽略.DS_Store

提交并推送

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.