将Git标记文件添加到忽略列表后,为什么不删除它?

时间:2018-04-10 08:42:11

标签: git gitignore

我很好奇为什么Git不会在以后忽略该文件/目录/子目录时(.gitignore)报告已删除的已跟踪文件/目录/子目录。

由于忽略告诉Git不跟踪它,因此当前HEAD / staging area和当前工作目录之间的差异将是该文件/目录/子目录(已被忽略)应该是Git报道已删除。

由于 DK

1 个答案:

答案 0 :(得分:2)

这应该是一个评论,除了它太长并且需要格式化。

  

......因为忽略告诉Git不跟踪[文件]

这是你出错的地方。

.gitignore中列出文件路径或路径模式,不会告诉Git不跟踪文件

在Git中,跟踪跟踪文件的原因是索引中存在该文件的路径。 如果路径在索引中,则会跟踪文件。

当您从一个提交移动到另一个提交时,索引的内容会动态更改。特别是,git checkout commit-or-branch从您选择的提交中加载索引(并填充您的工作树)。如果该提交包含某个特定文件,则该文件的路径现在位于索引中,并且现在跟踪该文件(并已将其提取到工作树中)。如果该文件的路径在提交中,则该文件的路径现在在索引中,并且该文件现在跟踪(并且刚从你的工作树中删除,如果有的话。)

所有这一切都发生在你的.gitignore文件中(包含一个修饰符:列出.gitignore中的文件,Git允许覆盖或删除它,当否则它可能会拒绝首先执行git checkout。因此,在.gitignore 中列出文件并不会让Git忽略它。如果当前正在跟踪该文件,.gitignore列表根本就没有效果!

.gitignore未跟踪的文件的作用是:

  • 关闭未经跟踪的事情。否则Git会继续纠缠你,这很烦人。
  • 当您使用git addgit add -A这样的大型git add .命令时,让Git跳过该文件 - 事实上,如果您尝试按名称git add,Git会告诉你它现在没有跟踪并被列为忽略,如果你真的想要添加它,你将不得不使用--force选项。
  • 并且,如上所述,在某些情况下,允许Git删除该文件,否则它会告诉您检出某些特定的现有提交会覆盖或删除它。

该文件可能应该命名为.git-do-not-complain-about-some-files-that-are-untracked-and-by-the-way-feel-free-to-clobber-these-files-too,或者沿着这些行命名。但是这个名字有点难以使用,所以它被称为.gitignore

要查看处理意外提交的文件的几种方法,请参阅How to stop tracking and ignore changes to a file in Git?还可以“重写历史记录”,进行新的提交,每个人都应该切换到使用包含旧提交的代码意外提交的文件。但是,拥有意外提交文件的存储库副本的所有人必须切换到新的提交系列。在某些方面,更容易创建一个永远不会提交文件的新存储库(这基本上是相同的过程)。