ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我该如何解决?

您究竟是如何将它添加到 .gitignore 的?它应该适用于所有目录(对我有用)。
它也为我工作。我还尝试了当它位于文件末尾时,如果您必须有一个(特定于平台的)换行符,但这并没有改变层次结构任何部分中的 .DS_Store 目录仍然被忽略。
据我了解,问题是:如何轻松忽略所有子目录中所有出现的 .DS_Store 而无需在每个子目录中手动执行此操作。我有同样的问题。下面的答案显示了如何解决它(最后 2 段)。

b
blkpingu

我认为您遇到的问题是在之前的一些提交中,您不小心将 .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 用户都需要这样做,但只需要一次。如果我们在存储库范围内进行,那么我们需要对每个存储库都这样做。我不了解你,但我一直在做新的回购。通过在全球范围内进行,可以一劳永逸地解决问题。
r
ronald8192

**/.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,来自:stackoverflow.com/questions/18393498/…
如果您在相关文件夹中有打开的文件,似乎需要添加 -ffind . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
d
drjorgepolanco

如果 .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 如何导航目录的方法。这个 stackoverflow 答案完全解释了它stackoverflow.com/a/28199633/4092170
** 永远不会匹配隐藏 (./) 目录:facelessuser.github.io/wcmatch/glob
像魅力一样工作。你必须按照这里的指示一步一步地做,否则它不会起作用
C
Community

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

# Ignore Mac DS_Store files
.DS_Store

只要您不包含斜杠,它就会与所有目录中的文件名匹配。 (来自 here


它仍然被上传到回购
@FreddySidauruk 那么你必须运行 git rm --cached path/to/file/here
s
stevec

只需将其放在 .gitignore 中的新行

**/.DS_Store

来自git documentation

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


正如您引用的文档中所述,**/.DS_Store 只是一种更复杂的书写方式 .DS_Store。当您想要 gitignore 特定路径模式时,您只需要双星,无论它发生在哪里。例如,只有在 foo 子目录中找到 .DS_Store 文件时,**/foo/.DS_Store 才会隐藏(不管 foo 在哪里)。
@orlp 一直都是这样吗?我会发誓我已将 .DS_Store 添加到 .gitignore 一百万次,只是为了让 .DS_Store 出现在子目录中。在测试您的信息之后,您似乎是完全正确的。它改变了我对这个 SO 问题的看法。但更一般地说:意外忽略子目录中的文件的(高)风险恰好与其他地方故意忽略的另一个文件同名。对于 git 来说,这样的行为似乎很糟糕(尽管很方便)。感谢您指出。
t
travelingbones

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

git rm -f *.DS_Store

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

*.DS_Store
.DS_Store

到.gitignore。这对我有用!


J
Jacob

*.DS_Store 添加到您的 .gitignore 文件中。这对我来说非常有用


A
Andrew Wilhelm

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


v
vishnu

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

寻找 。 -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

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

步骤 :3) 在 .gitignore git add .gitignore git commit -m "removed .DS_Store" 中提交您的更改


m
mate.gvo

git rm ./*.DS_Store - 从 git 中删除所有 .DS_Store $ echo \.DS_Store >> .gitignore - 将来忽略 .DS_Store

提交和推送


这对我有用。谢谢你。
K
Kiran Jasvanee

您应该在创建项目时添加以下行。它将始终忽略要推送到存储库的 .DS_Store

*.DS_Store 这将在代码提交时忽略 .DS_Store。
git rm --cached .DS_Store 这是从存储库中删除 .DS_Store 文件,如果需要,可以取消注释。

## ignore .DS_Store file.
# git rm --cached .DS_Store
*.DS_Store