我正在本地克隆的远程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 add
或git 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闭嘴,使用.gitignore
1
正如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文件之后创建的,它将在更新中被携带。