. ds_store在我的Git仓库中显示为一个待处理的更改,尽管没有被跟踪



我正在本地克隆的远程Github存储库中工作。我用create-react-app在我的本地repo中启动了一个新项目,它会自动生成一个包含.DS_Store.gitignore文件。我将空项目推到远程仓库,在本地创建了一个分支,并在项目中做了一些初始工作。当我结束一天的工作时,我在分支上添加并提交了所有的更改,但是在这样做之后,我的VSCode源代码控制面板仍然显示我有一个待处理的更改:在.DS_Store文件中,尽管VSCode明确地告诉我该文件未被跟踪(当我打开.DS_Store文件时,VSCode中的选项卡字面上说"。DS_Store(无足迹的)")。

然后,当我运行git status时,我得到这个:

On branch develop
Your branch is up to date with 'origin/develop'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
../.DS_Store
nothing added to commit but untracked files present (use "git add" to track)

我尝试添加并再次提交,但由于文件显然是未跟踪的,挂起的更改仍然存在。将我的分支与main合并并推送到远程repo中没有任何问题,但是VSCode仍然告诉我,我还有最后一个未决的更改。在Finder中,我也根本看不到存储库中任何地方的文件,尽管我有可见的隐藏文件。我很困惑为什么它会跟踪未跟踪文件中的更改。有谁能帮我解释一下这是怎么回事吗?

git正在跟踪.DS_Store的更改,因为它是通过git addgit add的某些变体添加到您的repo中的。您甚至可能在工作文件夹及其子文件夹中添加了其他文件,无意中添加了您甚至看不到的不相关文件。尽管如此,git现在还是在跟踪git add中你让它跟踪的所有更改,无论有意还是无意。

要让git永远忽略它们…1)添加它们to.gitignore;然后2)git rm它们来自git的repo如下:

1)添加文件名到.gitignore

正如在这个线程的其他地方提到的,你应该只有一个.gitignore文件,该文件应该驻留在你的repo的顶部("root")目录文件夹。

cd到该目录,并使用zsh(或语法调整后的bash-等效)循环将不需要的文件的名称和位置附加到.gitignore:

for f in `/bin/ls -R ./**/.DS_Store`; do echo $f; done >> ./.gitignore

然后……

2)删除repo对这些文件的引用

删除输出从循环末尾附加重定向(>> ./.gitignore),并使用其余部分删除git对文件的引用…

for f in `/bin/ls -R ./**/.DS_Store`; do git rm $f; done

对于git警告您"更改"的内容,运行git rm --cached

指出

注1

使用git的dry-run特性(-n)从来都不是一个坏主意,这样你就可以看到git是如何响应的,而不会破坏任何东西。

例如,

git rm -n /*/**/.DS_Store
git rm -n --cached ./.DS_Store

注2

请注意,当你完成时,你只会从git的中删除文件。但是NOT这一点很重要,因为这些恰好是与MacOS本身相关的隐藏文件。

你的帖子标题是:

。尽管未被跟踪,但DS_Store在我的Git仓库中显示为未决更改

你是对的,它没有被跟踪:

On branch develop
Your branch is up to date with 'origin/develop'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
../.DS_Store
nothing added to commit but untracked files present (use "git add" to track)

但是从标题上看,你声称这是一个"待修改的Git报告",这是错误的。(这是可能的VSCode,它做自己的事情,是误导你在这里,因为你提到VSCode,但你已经发布了这个git,而不是visual studio-code - edit:哦,我看到有人删除那个标签)。它只是显示为一个未追踪的文件。这很正常!你只是想让Git闭嘴,使用.gitignore1

正如Michael Delgado在评论中所说,路径名:

../.DS_Store

在这里很重要。这意味着您在工作树的子目录中:工作树中的某个文件夹,而不是.git目录本身存在的顶层。你需要上升一层:

cd ..

在创建或更新.gitignore文件之前,应该列出Mac Finder创建的.DS_Store文件。如果您位于顶层的app/中,那么app/.gitignore文件不能使Git忽略(闭嘴)顶层的.DS_Store文件。它可以忽略文件app/.DS_Store,但不能忽略顶层文件。


1让Git闭嘴是一个好主意。理想情况下,git status的每个输出行都应该是有用的。.DS_Store不会被提交的事实是可取的,所以抱怨它,就像Git正在做的那样,是没有用的。

如果gitignore规则是在git已经记录了。ds文件之后创建的,它将在更新中被携带。

最新更新