14

我不小心在 git repo 中跟踪了工作区配置文件。试图解决问题,我git rm --cached将这些文件添加到.gitignore文件中。

现在每次我从回购中签出一个分支时,这些都会被删除。有没有办法避免这种情况?

4

1 回答 1

16

问题是git rm提交存在于某些分支中,但不是全部,这意味着当您从一个仍然包含文件的分支切换到您git rm编辑过的分支时,git 将正确删除文件。您真正想要做的是从 git 的历史记录中删除文件,就好像它们从未存在过一样,遵循这个问题。但是,您应该知道这意味着重写存储库历史记录,因此一件事git push --force之后您将不得不这样做,另一方面,您会让其他也使用此存储库的人感到不安。

编辑如果重写历史不可行,请确保在现有的每个分支git rm --cached上提交操作。但是,如果您在删除之前签出修订,您仍然会遇到不愉快的重新删除。

摘要

  • 如果无法重写历史记录,则向每个分支提交一个.gitignore+ ,但请记住,签出任何先前的修订版(例如通过标签)将 a)产生有关 git 想要签出的现有未跟踪文件的错误,并且 b)导致再次删除这些文件git rm --cached切换回 HEAD
  • 如果您可能经常检查以前的修订版(或某些意外提交的文件包含敏感数据),请重写历史记录以避免这种情况,但请注意这会搞砸其他所有人的克隆

事实上,还有第三种可能性:为每个分支创建一个新分支,在其中重写历史记录,同时在原始版本中添加一个提交,删除所有文件(除了要忽略的文件!1)添加一个高度可见的文件解释混乱并要求用户从现在开始切换到重写的分支并删除未重写的本地副本。


1这样做的原因是您不想删除其他用户的这些文件的版本,这些文件从一开始就不应该被版本化,并且由于预计不会切换回旧版本,这将永远不会产生说“文件已经存在”错误

于 2013-08-27T12:31:44.493 回答