我很好奇为什么Git不会在以后忽略该文件/目录/子目录时(.gitignore
)报告已删除的已跟踪文件/目录/子目录。
由于忽略告诉Git不跟踪它,因此当前HEAD
/ staging area
和当前工作目录之间的差异将是该文件/目录/子目录(已被忽略)应该是Git报道已删除。
由于 DK
答案 0 :(得分:2)
这应该是一个评论,除了它太长并且需要格式化。
......因为忽略告诉Git不跟踪[文件]
这是你出错的地方。
在.gitignore
中列出文件路径或路径模式,不会告诉Git不跟踪文件。
在Git中,跟踪跟踪文件的原因是索引中存在该文件的路径。 如果路径在索引中,则会跟踪文件。
当您从一个提交移动到另一个提交时,索引的内容会动态更改。特别是,git checkout commit-or-branch
从您选择的提交中加载索引(并填充您的工作树)。如果该提交包含某个特定文件,则该文件的路径现在位于索引中,并且现在跟踪该文件(并已将其提取到工作树中)。如果该文件的路径在提交中不,则该文件的路径现在在索引中不,并且该文件现在未跟踪(并且刚从你的工作树中删除,如果有的话。)
所有这一切都发生在你的.gitignore
文件中(包含一个修饰符:列出.gitignore
中的文件,Git允许覆盖或删除它,当否则它可能会拒绝首先执行git checkout
。因此,在.gitignore
中列出文件并不会让Git忽略它。如果当前正在跟踪该文件,.gitignore
列表根本就没有效果!
.gitignore
对未跟踪的文件的作用是:
git add
或git add -A
这样的大型git add .
命令时,让Git跳过该文件 - 事实上,如果您尝试按名称git add
,Git会告诉你它现在没有跟踪并被列为忽略,如果你真的想要添加它,你将不得不使用--force
选项。该文件可能应该命名为.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?还可以“重写历史记录”,进行新的提交,每个人都应该切换到使用包含旧提交的代码意外提交的文件。但是,拥有意外提交文件的存储库副本的所有人必须切换到新的提交系列。在某些方面,更容易创建一个永远不会提交文件的新存储库(这基本上是相同的过程)。