你如何永久地删除git中已经被存储库跟踪过的文件?

时间:2016-12-14 03:14:58

标签: git

如何永久地删除已经由您的存储库跟踪的文件(每个分支都有它)。我注意到.gitignore仅在存储库尚未跟踪文件时才有效,如果已经包含该文件,则只要切换到分支,就需要不断更改文件。每次更改分支时,我都不想继续更改文件。我已经对变量进行了硬编码,以避免在开发过程中进行调试时出现问题,而且每次切换到不同的分支时我都厌倦了对变量进行重新编码。此外,我不想在重新硬编码文件后在控制台中输入git rm --cached。

1 个答案:

答案 0 :(得分:2)

定义:在Git中,“未跟踪”仅表示“不在索引中”。

结果:任何给定文件的跟踪或未跟踪状态取决于此时索引中的内容。

问题:当您执行git add(放入内容),git rm(取消内容)或 - 或这是踢球者 - git checkout 1 现在,作为用户,您可以控制何时运行git addgit rm,这样您就可以控制何时以及是否你自己在索引中放了一些东西。但是当你git checkout整个提交时,你的控制力就会降低。

如果您要签出的提交包含该文件,则该文件将进入索引。它现在被跟踪。您只能通过删除它来“去除”它。您当然可以使用git rm --cached,它会从索引中删除 ,而不会在工作树中保持不变。这将覆盖您,直到您git checkout另一个也有该文件的提交,将重新放入索引。

变通方法:您可以将索引条目标记为“Git可能,但不必,假设此文件未更改”或甚至“Git应该尽可能地尝试保持此文件不变。“后者更强大,因此可能是使用者。但是,这实际上并没有使文件保持不变:它只是让Git努力不改变它。通过这种方式,您可以在git checkout提交更改或删除它的提交时收到警告或错误,但您仍必须手动保留它(在此过程中将其取出),然后更改提交,然后放入它随着国旗回来了。有关详情,请参阅Git - Difference Between 'assume-unchanged' and 'skip-worktree'

1 即改变提交的git checkout种类。还有另一种git checkout只是改变文件。当您使用这种git checkout时,您可以列出要检出的文件。但这并不是一个合适的解决方法。最终的解决方案是永远不要切换到包含文件的提交 - 这意味着,永远不要将其签入。如果您已经签入,则有点卡住:您可以使用git filter-branch之类的命令或BFG将重写存储库作为没有提交文件的存储库,但这是一个痛苦的解决方案。

当然,您可以在拥有该文件的每个分支上创建一个已删除该文件的新提交,以便现在从分支切换到分支不再将该文件作为跟踪。但是,检查 提交 的任何提交文件会导致文件进入索引,从而进行跟踪。

更糟糕的是,将文件列在.gitignore中 - 这是您通常想要的,以防止它再次被跟踪 - 告诉Git随时 clobber 该文件。