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

Joh*_*ley 1167 git macos gitignore

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

ben*_*ado 2259

从存储库中删除现有文件:

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Run Code Online (Sandbox Code Playgroud)

添加行

.DS_Store
Run Code Online (Sandbox Code Playgroud)

到文件.gitignore,可以在您的存储库的顶层找到(或者如果它已经存在则创建).您可以使用顶级目录中的此命令轻松完成此操作

echo .DS_Store >> .gitignore
Run Code Online (Sandbox Code Playgroud)

然后

git add .gitignore
git commit -m '.DS_Store banished!'
Run Code Online (Sandbox Code Playgroud)

  • @Andrew:我不同意.对于.DS_Store文件进行检入永远不会有用,因此作为整个存储库的全用户设置更有意义,而不是每个Mac用户需要记住在自己的机器上设置的内容. (101认同)
  • @CharlieS是的,如果模式不包含斜杠,则它与所有目录中的文件名匹配. (67认同)
  • 将`.DS_Store`添加到`.gitignore`会递归吗?也就是说,它会忽略`some/level/of/folders/.DS_Store`吗? (50认同)
  • 这真的很简单,但使用`-exec`将为每个.DS_Store文件启动一次`git-rm`,而`xargs`将把所有路径放在一个命令行上.我更喜欢`xargs`,因为我不必担心逃避很多特殊字符. (11认同)
  • 这应该使用.git/info/exclude,而不是.gitignore.有关两者之间差异的解释,请参见http://stackoverflow.com/questions/1753070/git-ignore-files-only-locally/1753078#1753078. (6认同)
  • 你也可以`找到 . -name .DS_Store -exec git rm -f --ignore-unmatch '{}' +` -- 这与 `xargs` 类似,但输入更短。 (3认同)
  • 怎么样:`找到。-name .DS_Store -delete`? (2认同)

Tur*_*adg 230

结合benzado和webmat的答案,更新git rm,而不是发现不在repo中的文件失败,并使其一般可以为任何用户粘贴:

# 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
Run Code Online (Sandbox Code Playgroud)

  • 我发现在我的主目录中使用 git 存储库(也称为“dotfiles”存储库)时,将 `~/.gitignore` 作为我的全局排除文件是一种痛苦。有些文件我想从我的主目录中排除,我不想全局忽略。我通过相同的指令使用 `~/.gitexcludes` 代替:`core.excludesfile` (3认同)

Ner*_*rve 144

解决此问题的最佳解决方案是全局忽略系统上所有git存储库中的这些文件.这可以通过创建全局gitignore文件来完成,例如:

vi ~/.gitignore_global
Run Code Online (Sandbox Code Playgroud)

添加规则以忽略如下文件:

# 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
Run Code Online (Sandbox Code Playgroud)

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

git config --global core.excludesfile ~/.gitignore_global
Run Code Online (Sandbox Code Playgroud)

编辑:

删除了图标,因为它们可能需要作为应用程序资产提交.

  • 我建议每个开发人员在自己的 .global_ignore 中处理他的操作系统特定文件,这样项目 .gitignore 就是项目特定的。 (4认同)

web*_*mat 58

在某些情况下,您可能还想忽略全局的某些文件.对我来说,.DS_Store就是其中之一.这是如何做:

git config --global core.excludesfile /Users/mat/.gitignore
Run Code Online (Sandbox Code Playgroud)

(或您选择的任何文件)

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


Reg*_*ham 22

如果由于进行了更改而无法删除文件,请使用:

git rm --cached -f *.DS_Store
Run Code Online (Sandbox Code Playgroud)

  • 对我来说这解决了: `git rm --cached -f .DS_Store` (2认同)

Kar*_*vel 17

打开终端并输入"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. 输入以保存文件

  7. git add .gitignore

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


小智 15

我不得不在上面将git-rm更改为git rm以使其工作:

find . -depth -name '.DS_Store' -exec git rm --cached '{}' \; -print
Run Code Online (Sandbox Code Playgroud)


Jos*_*nce 14

最受欢迎的答案很棒,但帮助像我这样的新手,这里是如何创建.gitignore文件,编辑它,保存它,删除你可能已添加到git的文件,然后将文件推送到Github.

创建.gitignore文件

要创建.gitignore文件,您只能touch创建具有指定名称的空白文件的文件.我们要创建名为.gitignore的文件,以便我们可以使用以下命令:

touch .gitignore

忽略文件

现在你必须添加一行告诉git忽略你的.gitignore的DS Store文件.您可以使用nano编辑器执行此操作.

nano .gitignore

Nano很不错,因为它包含了如何摆脱它的说明.(Ctrl- O保存,Ctrl- X退出)

复制并粘贴这个Github要点中的一些想法,列出了一些要忽略的常见文件.回答这个问题最重要的是:

# OS generated files #
######################
.DS_Store
.DS_Store?
Run Code Online (Sandbox Code Playgroud)

#是评论,可以帮助您在文件增长时整理文件.

这篇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 将为您创建文件。 (4认同)

Lov*_*Mob 13

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

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

.gitignore
Run Code Online (Sandbox Code Playgroud)

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

.DS_Store
._.DS_Store
**/.DS_Store
**/._.DS_Store
Run Code Online (Sandbox Code Playgroud)

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

如果它已经存在,请在您的终端中写入:

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Run Code Online (Sandbox Code Playgroud)

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

git commit -m "Remove .DS_Store from everywhere"
git push origin master
Run Code Online (Sandbox Code Playgroud)

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

其他解决方案

如果 .DS_Store 已经提交:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
Run Code Online (Sandbox Code Playgroud)

在所有存储库中忽略它们:(有时它名为 ._.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
Run Code Online (Sandbox Code Playgroud)


use*_*745 12

步骤1

这将删除.DS_Store目录中的每个文件(包括子目录)

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Run Code Online (Sandbox Code Playgroud)

第2步

添加此以.gitignore防止根目录每个子目录中的任何 DS_Store 文件进入 git!

**/.DS_Store
Run Code Online (Sandbox Code Playgroud)

来自git 文档

  • 前导“**”后跟斜杠表示在所有目录中匹配。例如,“**/foo”在任何地方匹配文件或目录“foo”,与模式“foo”相同。“**/foo/bar”匹配直接位于目录“foo”下的任何位置的文件或目录“bar”。


Nat*_*han 10

使用删除它们git-rm,然后添加.DS_Store .gitignore以阻止它们再次添加.您还可以使用blueharvest来阻止它们一起创建


小智 9

永远摆脱这个文件并且永远不必再担心它的最佳方法是

制作一个全局 .gitignore 文件:

echo .DS_Store >> ~/.gitignore_global

并让 git 知道您想将此文件用于所有存储库:

git config --global core.excludesfile ~/.gitignore_global 就是这样!.DS_Store 是你的方式。


小智 9

有时 .DS_Store 文件位于远程存储库中,但在本地项目文件夹中不可见。要解决此问题,我们需要删除所有缓存文件并再次添加。

第 1 步:将此添加到 .gitignore 文件中。

# Ignore Mac DS_Store files
.DS_Store
**/.DS_Store
Run Code Online (Sandbox Code Playgroud)

步骤 2:删除缓存文件并使用这些命令再次添加。

git rm -r --cached .
git add .
git commit -am "Removed git ignored files"
git push -f origin master
Run Code Online (Sandbox Code Playgroud)

  • 实际上不需要`**/.DS_Store`行,添加`.DS_Store`就足够了。 (4认同)

Sun*_*nny 8

使用此命令删除现有文件:

find . -name '*.DS_Store' -type f -delete
Run Code Online (Sandbox Code Playgroud)

然后加入.DS_Store.gitignore


小智 7

以下对我来说效果最好.处理不匹配的文件和具有本地修改的文件.作为参考,这是在运行git 1.7.4.4的Mac 10.7系统上.

查找并删除:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch -f
Run Code Online (Sandbox Code Playgroud)

我还通过设置全局core.excludes文件来全局忽略所有存储库中的.DS_Store.

首先,创建文件(如果尚不存在):

touch ~/.gitignore
Run Code Online (Sandbox Code Playgroud)

然后添加以下行并保存:

.DS_Store
Run Code Online (Sandbox Code Playgroud)

现在配置git以全局尊重文件:

git config --global core.excludesfile ~/.gitignore
Run Code Online (Sandbox Code Playgroud)


小智 7

如果您要将DS_Store文件删除到每个文件夹和子文件夹:


如果已经提交了DS_Store:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
Run Code Online (Sandbox Code Playgroud)

忽略它们:

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
Run Code Online (Sandbox Code Playgroud)


man*_*nat 6

我发现snipplr的以下行最能擦除所有内容.DS_Store,包括一个有局部修改的行.

find . -depth -name '.DS_Store' -exec git-rm --cached '{}' \; -print
Run Code Online (Sandbox Code Playgroud)

--cached选项,保留你的本地,.DS_Store因为它无论如何都会被复制.

就像上面提到的那样.DS_Store,在项目的根目录中添加.gitignore文件.然后它将不再在您的视线中(回购).


Joh*_*ley 5

这将起作用:

find . -name "*.DS_Store" -type f -exec git-rm {} \;
Run Code Online (Sandbox Code Playgroud)

它会删除名称以 结尾的所有文件.DS_Store,包括._.DS_Store.

  • 星号不应该在那里。 (3认同)
  • 星号应该在那里,因为我在我的 mac 系统上找到了 .DS_Store 和 ._.DS_Store 文件。 (3认同)
  • @MutantMahesh。在这种情况下,您需要 `"*.DS_Store"`,以便将星号传递给 `find` 而不是由 shell 扩展。 (3认同)

Inv*_*ble 5

出于某种原因,以上都不适用于我的 Mac。

我的解决方案是从终端运行:

rm .DS_Store
Run Code Online (Sandbox Code Playgroud)

然后运行以下命令:

git pull origin master
Run Code Online (Sandbox Code Playgroud)


小智 5

我参加聚会有点晚了,但是我有一个很好的答案。要删除.DS_Store文件,请在终端窗口中使用以下命令,但要非常小心地使用'find'删除文件。使用带有-name选项的特定名称是更安全的使用方式之一:

cd directory/above/affected/workareas
find . -name .DS_Store -delete
Run Code Online (Sandbox Code Playgroud)

如果只想在它们之前和之后列出它们,则可以省略“ -delete”。这样可以使您确信它们已经消失了。

关于〜/ .gitignore_global建议:在这里要小心。您想将该漂亮的文件放在每个工作区的顶层的.gitignore中并提交,以便克隆您的存储库的任何人都可以从使用它的好处中受益。


Cub*_*czx 5

删除忽略的文件:

(.DS_Store)

$ find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
Run Code Online (Sandbox Code Playgroud)