从工作树中删除文件后,.gitignore不会取消跟踪该文件 [英] .gitignore will not untrack a file after removing it from the working tree

查看:6
本文介绍了从工作树中删除文件后,.gitignore不会取消跟踪该文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到一个问题,即.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆