【问题标题】:Why doesn't Git mark files deleted after I add them to the ignore list? [duplicate]为什么我将文件添加到忽略列表后,Git 不将文件标记为已删除? [复制]
【发布时间】:2018-09-19 19:24:38
【问题描述】:

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

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

谢谢 dk

【问题讨论】:

标签: git gitignore


【解决方案1】:

这确实应该是一个注释,只是它太长并且需要格式化。

... ignoring 告诉 Git 不要跟踪 [文件]

这就是你出错的地方。

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

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

当您从一个提交移到另一个提交时,索引的内容会动态变化。特别是,git checkout <em>commit-or-branch</em> 从您选择的提交中加载索引(并填充您的工作树)。如果该提交包含某个特定文件,则该文件的路径现在在您的索引中,并且该文件现在被跟踪(并且已被提取到您的工作树中)。如果该文件的路径在提交中 not,则该文件的路径现在 not 在您的索引中,并且该文件现在 not 被跟踪(并且刚刚从您的工作树中删除,如果它在那里)。

无论您的 .gitignore 文件中有什么内容,所有这些都会发生(使用一个修饰符:在 .gitignore 中列出一个文件会授予 Git 覆盖或删除它的权限,否则它可能会拒绝首先做git checkout)。所以在.gitignore 中列出一个文件不会让Git 忽略它。如果该文件当前被跟踪,.gitignore 列表对其没有任何影响!

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

  • 关于未跟踪的问题让 Git 闭嘴。否则 Git 会一直纠缠你,这很烦人。
  • 当你使用像git add -Agit add . 这样的集体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? 也可以“重写历史记录”,以进行每个人都应该切换到使用的新提交来代替包含意外提交的旧提交-提交的文件。但是,每个拥有包含意外提交文件的存储库副本的人都必须切换到新的提交系列。在某些方面,创建一个从不提交文件的新存储库会更容易(这本质上是相同的过程)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2012-07-05
    • 2010-09-30
    • 2021-04-20
    • 2020-05-30
    • 2010-11-22
    相关资源
    最近更新 更多