从工作树中删除文件后,.gitignore不会取消跟踪该文件 [英] .gitignore will not untrack a file after removing it from the working tree
问题描述
我遇到一个问题,即.gitignore不会忽略文件(‘Private/config.php’)。
忽略文件如下:
public/uploads/
logs/
private/config.php
该文件最初包含在跟踪的文件中,因此我将其从分支中删除,如下所示,但正如您将从git ls-tree
命令中看到的那样,它仍然显示在跟踪的文件列表中...
ubuntu@MYMACHINE:/var/www/gig$ git rm --cached private/config.php
rm 'private/config.php'
ubuntu@MYMACHINE:/var/www/gig$ git ls-tree -r main --name-only
.gitignore
README.md
private/config.php
private/initialize.php
[...]
奇怪的是,我在本地文件夹中发出命令时也遇到了同样的问题:
ubuntu@MYMACHINE:/var/www/gig/private$ git rm --cached config.php
fatal: pathspec 'config.php' did not match any files
ubuntu@MYMACHINE:/var/www/gig/private$ git rm --cached private/config.php
fatal: pathspec 'private/config.php' did not match any files
ubuntu@MYMACHINE:/var/www/gig/private$ git ls-tree -r main --name-only
config.php
initialize.php
有关如何从跟踪的文件中清除此文件的任何线索?
推荐答案
在.gitignore
从不中列出文件会导致变为未跟踪。
跟踪文件,或取消跟踪文件。此属性由单个问题的答案决定:
- 该文件当前是否在Git的索引中?
如果答案是";yes";,则跟踪该文件。如果答案是";no";,则该文件未跟踪。1
1如果您的工作树中也缺少该文件,大多数人会将其称为&不存在&,但事实上,所有不存在的未跟踪文件也都是未跟踪的。当前未跟踪不存在的文件&zaffod_Beeblebrox";。
关于Git的索引
现在,这里真正棘手的部分与Git的索引有关。索引--这在Git中很重要;您需要了解它的所有内容--很难查看。你主要通过对比来看指数。但是,索引是很容易描述,尽管这遗漏了一些细微差别:
Git的索引包含您建议的下一次提交。
所有提交一旦完成,都是完全只读的,并且在时间上始终处于冻结状态。任何现有提交的任何部分都不能永远更改。您创建新提交者:
- 提取一些现有的提交(到您的工作树中,这将使您获得可以更改的普通读/写文件);
- 在那里做一些工作,使用可以查看和使用的文件;以及
- 最终,使用
git commit
进行新提交。
在大多数版本控制系统中,它们的"提交"谓词接受当时工作树中的任何内容,并使用它进行新的提交。吉特是..。不一样。当您运行git commit
时,Git将忽略您的工作树,而是使用Git的索引中存储的所有文件。
由于Git实际上从索引文件构建提交,因此索引中的文件至关重要。然后,您需要知道提取提交--从该提交中填充Git的索引。
一旦从某个提交中填充了索引,并且从提交中提取了文件,所有三个活动副本都匹配。在当前提交中,您有一个不能更改的文件。Git的索引中存储了另一个同名的文件。您的工作树中有该文件的第三个副本,作为常规读/写文件。
在更改了工作树中的某些文件之后,您需要运行git add
。这会将文件从您的工作树复制回Git的索引。
因此,Git还使用术语临时区域作为索引。索引副本据说是为提交而暂存的。运行git commit
将提交索引中的任何内容--无论是先前提取的文件的原始副本,还是您最近的git add
中的更新副本。
如果从Git索引中删除一个文件,则该文件将不会出现在下一次提交中。这就是git rm
的意义。
唉,如果您运行git rm somefile
,Git将从Git的索引和您的工作树中删除文件somefile
。所以现在它真的消失了。当然,它也没有被跟踪,但没有工作树副本,它就是简单的消失。
因此,您可以git rm --cached
:这只删除索引副本,而不删除工作树副本。现在该文件已未跟踪(将不在下一次提交中),但仍存在于工作树中。
一旦进行新的提交,提取新的提交将不会提取文件,因为它不在该提交中。但请记住,提取旧的提交-那些具有文件的提交-将提取文件,并将其放到Git的索引和您的工作树中。因此,文件将神奇地--实际上,相当不神奇--在这一点上被跟踪。切换到缺少的新提交时,该文件现在将从Git的索引和您的工作树中删除该文件,现在它未被跟踪,但也从您的工作树中删除。
归根结底,这意味着提交了一个文件,然后删除它并提交删除,这将设置一个陷阱:如果git rm --cache
该文件使得您提交了删除而不擦除工作树副本,则仍然只剩下:
- 旧提交已文件
- 新提交缺少文件
- 因此从旧的切换到新的会删除文件
这意味着您现在每次返回旧提交时都必须非常小心。
(另请参阅IMSoP's answer。)
这篇关于从工作树中删除文件后,.gitignore不会取消跟踪该文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!