ChatGPT解决这个技术问题 Extra ChatGPT

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

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

认为这在许多版本的 MacOS 中都是一样的,不仅是 Mac OS X。

S
SkunkSpinner

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

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 是的,如果模式不包含斜杠,它将与所有目录中的文件名匹配。
T
Turadg

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

解决此问题的最佳解决方案是全局忽略系统上所有 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 文件的存储库,所以这对某些人来说可能是个问题(我想其他人在这里添加了不同的扩展名)。
由于我是新手,乍一看这对我来说是一个很棒的资源,但我想知道是否有人可以指向我的视频或文章,以便我可以理解文件类型通常被忽略的原因.提前致谢!
T
Tim

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

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

(或您选择的任何文件)

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


R
Reggie Pinkham

如果由于文件已分阶段更改而无法删除文件,请使用:

git rm --cached -f *.DS_Store

对我来说,这解决了:git rm --cached -f .DS_Store
J
Joshua Dance

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

创建 .gitignore 文件

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

touch .gitignore

忽略文件

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

nano .gitignore

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

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

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

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

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 将为您创建文件。
2年后我找到了自己的答案并使用了它。干得好。 :)
工作完美!!谢谢
R
RajVimalC

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

K
Karthick Vadivel

打开终端并输入“cd < ProjectPath >”

删除现有文件:查找 . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch nano .gitignore 添加这个 .DS_Store 输入 "ctrl + x" 输入 "y" 输入保存文件 git add .gitignore git commit -m '.DS_Store 已删除。


nano .gitignore 如果文件不存在,则创建文件,此命令应从项目根文件夹执行
@Saif不一定。您可以在要排除子目录中的某些文件但不能排除根目录的任何目录中拥有 .gitignore。例如,我在我的许多回购中都有这个。
M
McKinley

永远摆脱此文件的最佳方法:

创建一个全局 .gitignore 文件:

echo .DS_Store >> ~/.gitignore_global

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

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

而已! .DS_Store 将在所有存储库中被忽略。


N
Nakilon

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

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

u
upful

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

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

然后将 .DS_Store 添加到 .gitignore


佚名

如果您想将 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

N
Nathan

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


j
jordantbro

以下对我来说效果最好。处理不匹配的文件,以及具有本地修改的文件。作为参考,这是在运行 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

s
stevec

步骤1

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

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

第2步

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

**/.DS_Store

git docs

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


完美运行!
z
zeozod

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

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

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

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


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

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

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

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

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


w
wjandrea

这将起作用:

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

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


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

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

我的解决方案来自终端运行:

rm .DS_Store

然后运行以下命令:

git pull origin master

那是因为您正试图将其从本地删除。而问题要求将其从 git 中删除。
d
dav1dhunt

初始化存储库时,跳过包含

-u

这不应该是一个问题。


如果其他人创建了 repo,而 OP 只与它同步怎么办?
J
JLunceford

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

$ 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


C
Cubiczx

删除忽略的文件:

(.DS_Store)

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

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

E
Ezequiel García

将此添加到您的文件 .gitignore

#Ignore folder mac
.DS_Store

保存并提交

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

现在你忽略了所有提交


b
brooksrelyt

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

并在其中添加以下行

.DS_Store

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


v
vinny

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

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

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

15 1 * * * 根查找 / -name ".DS_Store" -depth -exec rm {} \;

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

分钟 小时 DayOfMonth 月 DayOfWeek 用户命令。

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

该命令从 find 一直到 .如果系统未运行,则不会执行此命令。

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

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


W
Wael Assaf

无需在本地删除 .DS_STORE

只需将其添加到 .gitignore 文件

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

命令

纳米.gitignore

写入 .DS_Store 然后点击 CTRL+X > y > Hit Return

git status 最后看看你的更改

混帐添加.gitignore

git commit -m '你的提交信息'

git push 起源大师


Y
Yunnosch

我做了:

git checkout -- ../.DS_Store

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


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