.gitignore 每个文件夹和子文件夹中的所有 .DS_Store 文件
Posted
技术标签:
【中文标题】.gitignore 每个文件夹和子文件夹中的所有 .DS_Store 文件【英文标题】:.gitignore all the .DS_Store files in every folder and subfolder 【发布时间】:2013-08-25 22:54:08 【问题描述】:我已经将.DS_Store添加到.gitignore文件中,但似乎只是忽略了根目录中的.DS_Store,而不是在每个文件夹和子文件夹中。
我该如何解决这个问题?
【问题讨论】:
How Can I Remove .DS_Store Files From A Git Repository?的可能重复 你是如何将它添加到 .gitignore 的?它应该适用于所有目录(对我有用)。 它也对我有用。我也试过当它在文件末尾时,如果你必须有一个(特定于平台的)换行符,但这并没有改变层次结构任何部分中的 .DS_Store 目录仍然被忽略。 据我了解的问题是:如何轻松忽略所有子目录中所有出现的 .DS_Store 而无需在每个子目录中手动执行此操作。我有同样的问题。下面的答案显示了如何解决它(最后两段)。 【参考方案1】:我认为您遇到的问题是,在之前的一些提交中,您不小心将 .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
This page帮我回答了你的问题。
【讨论】:
最后 2 段回答了这个问题。谢谢。 ´´git rm --cached .DS_Store´´ 从当前目录中仅删除一个 .DS_Store。使用“查找”。 -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch´´ 从 repo 中删除所有 .DS_Stores 其他要忽略的常见文件列表可能会很方便 使用全局规则 IMO 的坏主意:尝试跨多个用户/机器维护全局配置永远不会奏效-您希望在 repo 本身中管理 repo 的规则。 Agree with this 我不同意你的看法。 (尽管我赞成你的评论,因为我认为它很有见地。)如果我们做全球,那么每个 mac 用户都需要这样做,但只需要一次。如果我们在存储库范围内进行,那么我们需要对每个存储库都这样做。我不了解你,但我一直在做新的回购。通过在全球范围内进行,可以一劳永逸地解决问题。【参考方案2】:您还可以将 --cached
标志添加到 auco 的答案中以维护本地 .DS_store 文件,正如 Edward Newell 在其原始答案中提到的那样。修改后的命令如下所示:find . -name .DS_Store -print0 | xargs -0 git rm --cached --ignore-unmatch
..cheers,谢谢!
【讨论】:
【参考方案3】:将**/.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
【讨论】:
仍然上传到我的仓库? @FreddySidauruk 首先使用git rm --cached your_file
@FreddySidauruk 应该是find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
,来自:***.com/questions/18393498/…
如果您在相关文件夹中有打开的文件,似乎需要添加-f
:find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
【参考方案4】:
将*.DS_Store
添加到您的 .gitignore 文件中。这对我很有效
【讨论】:
【参考方案5】:您的 .gitignore 文件应如下所示:
# Ignore Mac DS_Store files
.DS_Store
只要不包含斜杠,它就会与所有目录中的文件名匹配。 (来自here)
【讨论】:
它仍然被上传到 repo 中 @FreddySidauruk 然后你必须运行git rm --cached path/to/file/here
【参考方案6】:
第一步,删除所有*.DS_store
文件。一个人可以跑
git rm -f *.DS_Store
但请注意,如果您有错字,rm -f
可能会有点危险!
第二步:添加
*.DS_Store
.DS_Store
到.gitignore。这对我有用!
【讨论】:
【参考方案7】:如果 .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 文件中,然后再次提交并使用最后两段代码进行推送(git commit...、git push...)
【讨论】:
为什么要用双星号?这是什么意思? @MilanG 这是一个关键字,基本上意味着“在此目录和所有子目录中搜索”。 不确定这是对双星号代表什么的完美解释。它是一个通配符。可以*
或**
取决于您想要实现的目标。这是一种告诉 shell 如何导航目录的方法。这个***答案完全解释了***.com/a/28199633/4092170
** 永远不会匹配隐藏 (./) 目录:facelessuser.github.io/wcmatch/glob
就像一个魅力。你必须按照这里的指示一步一步地做,否则它不会起作用【参考方案8】:
步骤 :1) 使用此命令删除现有文件
找到 . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
步骤:2)在您的 .gitignore 文件中添加 .DS_Store
步骤 :3) 在 .gitignore 中提交您的更改 混帐添加.gitignore git commit -m "删除 .DS_Store"
【讨论】:
【参考方案9】:$ git rm ./*.DS_Store
- 从 git 中删除所有 .DS_Store
$ echo \.DS_Store >> .gitignore
- 以后忽略 .DS_Store
提交并推送
【讨论】:
这对我有用。谢谢。【参考方案10】:您应该在创建项目时添加以下行。它将始终忽略要推送到存储库的 .DS_Store
。
*.DS_Store
这将在代码提交时忽略 .DS_Store。git rm --cached .DS_Store
这是从存储库中删除 .DS_Store 文件,如果需要,可以取消注释。
## ignore .DS_Store file.
# git rm --cached .DS_Store
*.DS_Store
【讨论】:
【参考方案11】:只需将其放在 .gitignore
中的新行
**/.DS_Store
来自git documentation
前导“**”后跟斜杠表示在所有目录中都匹配。例如,“**/foo”在任何地方匹配文件或目录“foo”,与模式“foo”相同。 "**/foo/bar" 匹配文件或目录 "bar" 直接位于目录 "foo" 下的任何位置。
【讨论】:
以上是关于.gitignore 每个文件夹和子文件夹中的所有 .DS_Store 文件的主要内容,如果未能解决你的问题,请参考以下文章
获取给定路径中的所有文件和子文件夹 - C/C++ 中的语言兼容性