Git签出删除gitignore中的文件

Git签出删除gitignore中的文件,git,Git,我无意中跟踪了git repo中的工作区配置文件。为了解决这个问题,我缓存了那些文件,并将它们添加到.gitignore文件中 现在,每次我从回购协议中签出分支时,这些分支都会被删除。有什么办法可以避免这种情况吗?问题是,git rm提交存在于一些分支中,但不是所有分支中,这意味着当您从一个仍然包含文件的分支切换到一个您使用git rm的分支时,git将正确地删除文件。实际上,您要做的是从git的历史记录中删除这些文件,就像它们从未出现过一样,如下所示。但是,您应该知道,这意味着要重写存储库历史

我无意中跟踪了git repo中的工作区配置文件。为了解决这个问题,我缓存了那些文件,并将它们添加到
.gitignore
文件中


现在,每次我从回购协议中签出分支时,这些分支都会被删除。有什么办法可以避免这种情况吗?

问题是,git rm提交存在于一些分支中,但不是所有分支中,这意味着当您从一个仍然包含文件的分支切换到一个您使用git rm的分支时,git将正确地删除文件。实际上,您要做的是从git的历史记录中删除这些文件,就像它们从未出现过一样,如下所示。但是,您应该知道,这意味着要重写存储库历史记录,因此,一方面,您必须在之后
git push--force
,另一方面,您会让其他同样使用此repo的人感到不安

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

摘要

  • 如果历史记录无法重写,则向每个分支提交一个
    .gitignore
    +
    git rm--cached
    ,但请记住,签出任何以前的版本(例如,通过标记)将a)产生一个关于git想要签出的现有未跟踪文件的错误,b)在切换回HEAD时再次删除这些文件
  • 如果您可能经常签出以前的修订版(或意外提交的某些文件包含敏感数据),请重写历史记录以避免此情况,但请注意,这将破坏其他人的克隆
事实上,还有第三种可能性:对于每个分支,创建一个新的分支,在其中重写历史记录,同时在原始版本中添加一个提交,删除所有文件(要忽略的文件除外!1)添加一个高度可见的文件,解释混乱的原因,并要求用户从现在起切换到重写的分支,并删除未重写分支的本地副本



1原因是您不想删除这些文件的其他用户版本,这些文件从一开始就不应该进行版本控制,而且由于不希望用户切换回旧版本,因此将永远不会出现“文件已存在”错误,您删除了这些文件。你在抱怨他们被删除了?我不想让git忽略它们,而不是每次我更改分支时都删除它们。gitignore是否已在每个分支上提交?@Gabrieleptronella现在已经太迟了,
git rm
commit意味着切换到该分支(从文件仍有版本的分支)将导致git(正确地)再次删除文件。历史很可能不得不改变rewritten@Tobias我明白了,很好的回答请澄清这不是关于从历史记录中删除文件,而是关于在分支之间保持
.gitignore
一致。@YuvalAdam是关于从历史记录中删除文件-它们本来就不应该在那里,跨分支将它们放入
.gitignore
不会解决分支更改时的删除问题(尽管每个分支上的
git rm
+
.gitignore
提交会解决问题,而且如果许多用户访问repo,即使以牺牲肮脏的历史记录为代价,也应该优先考虑…)在不同的分支中忽略是我纠正的第一件事。但是它没有解决问题。@aitkiar您还必须在每个分支上创建一个
git rm--cached
commit,因为否则另一个分支在忽略文件的同时仍然跟踪它们,当git切换到一个您
git rm
'ed的分支时,它会认为“好的,现在我正在从一个文件仍然存在的分支切换到一个文件不存在的分支,所以我必须删除它们”“解决方案是重写历史记录,使文件看起来从未被跟踪过,但这是否是您的一个选项取决于其他人访问该文件repo@TobiasKienzler您的变通方法证明了我的观点,您不需要从历史记录中删除,只需从工作副本中删除并忽略即可。此外,在许多存储库中,历史重写是绝对不可接受的。因此,唯一合理的选择是在master和所有(相关)分支上转发delete和ignore。