【问题标题】:How can I Remove .DS_Store files from a Git repository?如何从 Git 存储库中删除 .DS_Store 文件?
【发布时间】:2010-09-11 14:01:23
【问题描述】:

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

【问题讨论】:

标签: macos git gitignore


【解决方案1】:

这将起作用:

find . -name "*.DS_Store" -type f -exec git-rm {} \;

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

【讨论】:

  • 星号不应该在里面。
  • 星号应该在那里,因为我在我的 mac 系统上找到了 .DS_Store 和 ._.DS_Store 文件。
  • @MutantMahesh。在这种情况下,您需要"*.DS_Store",以便将星号传递给find,而不是由shell 扩展。
【解决方案2】:

使用 git-rm 删除它们,然后将 .DS_Store 添加到 .gitignore 以阻止它们再次被添加。你也可以使用blueharvest 来阻止它们一起被创建

【讨论】:

    【解决方案3】:

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

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

    添加这一行:

    .DS_Store
    

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

    echo .DS_Store >> .gitignore
    

    然后将文件提交到 repo:

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

    【讨论】:

    • 这真的很简单,但是使用-exec 将为每个.DS_Store 文件启动一次git-rm,而xargs 会将所有路径放在一个命令行上。大多数情况下我更喜欢xargs,因为我不必担心转义很多特殊字符。
    • 这应该使用 .git/info/exclude,而不是 .gitignore。请参阅stackoverflow.com/questions/1753070/… 了解两者之间的区别。
    • @Andrew:我不同意。签入 .DS_Store 文件永远不会有用,因此它作为存储库范围内的所有用户设置更有意义,而不是每个 Mac 用户需要记住在她自己的机器上设置的东西。
    • .DS_Store 添加到.gitignore 是否递归工作?也就是说,它是否也会忽略some/level/of/folders/.DS_Store
    • @CharlieS 是的,如果模式不包含斜杠,则匹配所有目录中的文件名。
    【解决方案4】:

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

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

    (或您选择的任何文件)

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

    【讨论】:

      【解决方案5】:

      我发现snipplr 中的以下行最适合擦除所有.DS_Store,包括具有本地修改的一个。

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

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

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

      【讨论】:

        【解决方案6】:

        我必须在上面将 git-rm 更改为 git rm 才能使其工作:

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

        【讨论】:

          【解决方案7】:

          结合 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
          

          【讨论】:

          • 我发现在我的主目录中使用 git 存储库(也称为“dotfiles”存储库)时,将~/.gitignore 作为我的全局排除文件是一种痛苦。有些文件我想从我的主目录中排除,而我不想 想全局忽略这些文件。我通过相同的指令使用~/.gitexcludescore.excludesfile
          【解决方案8】:

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

          查找和删除:

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

          我还通过设置全局 core.excludesfile 全局忽略所有存储库中的 .DS_Store。

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

          touch ~/.gitignore
          

          然后添加以下行并保存:

          .DS_Store
          

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

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

          【讨论】:

            【解决方案9】:
            $ git commit -m "filter-branch --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
            $ git push origin master --force
            

            【讨论】:

              【解决方案10】:

              有一些解决方案可以解决此问题。 为避免创建 .DS_Store 文件,请勿使用 OS X Finder 查看文件夹。查看文件夹的另一种方法是使用 UNIX 命令行。 要删除 .DS_Store 文件,可以使用名为 DS_Store Terminator 的第三方产品。 要从整个系统中删除 .DS_Store 文件,可以使用 UNIX shell 命令。 从应用程序启动终端:实用程序 在 UNIX shell 提示符处输入以下 UNIX 命令: sudo find / -name ".DS_Store" -depth -exec rm {} \; 当提示输入密码时,输入 Mac OS X 管理员密码。

              此命令是查找并删除从文件系统的根 (/) 开始贯穿整个机器的所有 .DS_Store。 要将此命令配置为作为计划任务运行,请执行以下步骤: 从应用程序启动终端:实用程序 在 UNIX shell 提示符处输入以下 UNIX 命令:

              sudo crontab -e 当提示输入密码时,输入 Mac OS X 管理员密码。 在 vi 编辑器中按一下键盘上的字母 I 并输入以下内容:

              15 1 * * * root find / -name ".DS_Store" -depth -exec rm {} \;

              这称为crontab条目,格式如下:

              Minute Hour DayOfMonth Month DayOfWeek 用户命令。

              crontab 条目表示该命令将由系统在每天凌晨 1:15 由名为 root 的帐户自动执行。

              命令从 find 开始一直到 .如果系统没有运行,这个命令将不会被执行。

              要保存条目,请按一次 Esc 键,然后同时按 Shift + z+ z。

              注意:步骤 4 中的信息仅适用于 vi 编辑器。

              【讨论】:

                【解决方案11】:

                由于某种原因,上述方法都不适用于我的 mac。

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

                rm .DS_Store
                

                然后运行以下命令:

                git pull origin master
                

                【讨论】:

                • 那是因为你试图从本地删除它。而问题要求将其从 git 中删除。
                【解决方案12】:

                解决此问题的最佳解决方案是全局忽略系统上所有 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 中添加上述规则。如果您的项目有多个贡献者,这将在 repo 级别保留这些文件。但是,在这种情况下,如果不同的开发人员使用不同的操作系统,.gitignore 应该处理每个操作系统的特定文件等。像 linux、OSX 等的规则。
                • 我建议每个开发人员在自己的 .global_ignore 中处理他的操作系统特定文件,这样项目 .gitignore 是项目特定的。
                • 必须运行: git add .gitignore_global ,以便其他程序员在他的本地环境中也拥有该文件?
                • @stackdave 不,该文件甚至不受 git 控制。那在主目录中,他们也必须更新他们的 git 配置。甚至没有理由这样做。当已经存在用于相同目的的文件时,无需创建新文件。每个目录都可以有一个 .gitignore 并且还有特定于 repo 的信息/排除。另外-尽管我对此含糊不清-我认为您也可以使用 ~/.gitignore (不确定!)。哦,我也有包含 .jar 文件和 .log 文件的存储库,所以这对某些人来说可能是个问题(我想其他人在这里添加了不同的扩展名)。
                • 由于我是新手,乍一看这对我来说是一个很棒的资源,但我想知道是否有人可以指出我的视频或文章,以便我理解原因背后为什么通常会忽略文件类型。提前致谢!
                【解决方案13】:

                初始化存储库时,跳过包含的 git 命令

                -u
                

                这应该不是问题。

                【讨论】:

                • 如果其他人创建了 repo,而 OP 只是与之同步呢?
                【解决方案14】:

                如果您无法删除文件,因为它们已分阶段使用:

                git rm --cached -f *.DS_Store
                

                【讨论】:

                  【解决方案15】:

                  这对我有用,结合了上面的两个答案:

                  • $ git rm --cached -f *.DS_Store
                  • $ git commit -m "filter-branch --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
                  • $ git push origin master --force

                  【讨论】:

                    【解决方案16】:

                    将此添加到您的文件 .gitignore

                    #Ignore folder mac
                    .DS_Store
                    

                    保存并提交

                    git add -A
                    git commit -m "ignore .DS_Store"
                    

                    现在你所有的提交都忽略了这个

                    【讨论】:

                      【解决方案17】:

                      打开终端并输入“cd ”

                      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.'

                      【讨论】:

                      • nano .gitignore 如果文件不存在,则创建该文件,此命令应从项目根文件夹执行
                      • @Saif 不一定。您可以将 .gitignore 放在要排除子目录中的某些文件但不能排除根目录的任何目录中。例如,我在许多回购中都有这个。
                      【解决方案18】:

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

                      find . -name '*.DS_Store' -type f -delete
                      

                      然后将.DS_Store添加到.gitignore

                      【讨论】:

                        【解决方案19】:

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

                        创建 .gitignore 文件

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

                        touch .gitignore

                        忽略文件

                        现在您必须将告诉 git 忽略 DS 存储文件的行添加到您的 .gitignore。您可以使用 nano 编辑器来执行此操作。

                        nano .gitignore

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

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

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

                        # 是 cmets,将帮助您在文件增长时组织文件。

                        这个Github article 也有一些一般的想法和指导方针。

                        删除已添加到 git 的文件

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

                        从投票最多的答案中使用这个很棒的命令。这将遍历您目录中的所有文件夹,并从 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!'

                        【讨论】:

                        • 步骤中的触摸命令不是必需的... nano 将为您创建文件。
                        • 两年后我找到了自己的答案并使用了它。干得好。 :)
                        • 完美运行!!谢谢
                        【解决方案20】:

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

                        cd directory/above/affected/workareas
                        find . -name .DS_Store -delete
                        

                        如果您想简单地在之前和之后列出它们,您可以省略“-delete”。这会让你放心,他们已经走了。

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

                        【讨论】:

                        • 确实:当您要执行破坏性命令时,可以说最好在实际执行破坏性命令之前先打印将受到影响的文件。它可以为您节省很多痛苦(尤其是如果您是不备份的人,即使我们这些定期备份的人也可以通过这种方式节省时间)!
                        【解决方案21】:

                        删除被忽略的文件:

                        (.DS_Store)

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

                        【讨论】:

                          【解决方案22】:

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


                          如果已经提交 DS_Store:
                          find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
                          

                          通过以下方式忽略它们:

                          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
                          

                          【讨论】:

                            【解决方案23】:

                            无需在本地删除.DS_STORE

                            只需将其添加到.gitignore 文件中

                            .gitignore 文件只是一个文本文件,它告诉 Git 在项目中忽略哪些文件或文件夹。

                            命令

                            • nano .gitignore
                            • .DS_Store 然后点击CTRL+X > y > Hit Return
                            • git status 最后看看您的更改
                            • git add .gitignore
                            • git commit -m 'YOUR COMMIT MESSAGE'
                            • git push origin master

                            【讨论】:

                              【解决方案24】:

                              使用命令touch .gitignore创建.gitignore文件

                              并在其中添加以下行

                              .DS_Store
                              

                              保存 .gitignore 文件,然后将其推送到您的 git 存储库中。

                              【讨论】:

                                【解决方案25】:

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

                                制作一个全局 .gitignore 文件:

                                echo .DS_Store >> ~/.gitignore_global

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

                                git config --global core.excludesfile ~/.gitignore_global 就是这样! .DS_Store 不适合您。

                                【讨论】:

                                  【解决方案26】:

                                  我做了:

                                  git checkout -- ../.DS_Store
                                  

                                  (# 将本地更改(永久)丢弃到文件中) 它工作正常!

                                  【讨论】:

                                  • 如果您希望您的答案基于其他内容(例如对您不起作用的内容),那么您需要更清楚地参考。请理解,这里的“以上”不是可靠的参考,因为这里答案的显示顺序是不可预测的。这是因为订单策略是可配置的。
                                  【解决方案27】:

                                  步骤 1

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

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

                                  第二步

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

                                  **/.DS_Store
                                  

                                  来自git docs

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

                                  【讨论】:

                                    【解决方案28】:

                                    有时 .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
                                    

                                    【讨论】:

                                      猜你喜欢
                                      • 2011-01-04
                                      • 2014-03-19
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2011-03-28
                                      • 2012-08-31
                                      相关资源
                                      最近更新 更多