如何永久地删除已经由您的存储库跟踪的文件(每个分支都有它)。我注意到.gitignore仅在存储库尚未跟踪文件时才有效,如果已经包含该文件,则只要切换到分支,就需要不断更改文件。每次更改分支时,我都不想继续更改文件。我已经对变量进行了硬编码,以避免在开发过程中进行调试时出现问题,而且每次切换到不同的分支时我都厌倦了对变量进行重新编码。此外,我不想在重新硬编码文件后在控制台中输入git rm --cached。
答案 0 :(得分:2)
定义:在Git中,“未跟踪”仅表示“不在索引中”。
结果:任何给定文件的跟踪或未跟踪状态取决于此时索引中的内容。
问题:当您执行git add
(放入内容),git rm
(取消内容)或 - 或这是踢球者 - git checkout
。 1 现在,作为用户,您可以控制何时运行git add
或git 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 该文件。