如何从本地和远程的每个分支的Git Commit历史记录中删除文件?

时间:2018-09-20 19:38:22

标签: git tfs

这里有新手,

如何从Git提交中删除文件的所有痕迹-例如在本地和远程的每个分支中的任何地方删除它。

我见过的大多数文章和Stack Overflow之类的东西都指出,这种方式有些变化:

 git filter-branch --tree-filter 'rm -f file_to_remove.py' HEAD

 git filter-branch --tree-filter 'rm -f file_to_remove.py' ..HEAD

 git filter-branch --force --tree-filter 'rm -f file_to_remove.py' -- --all

等...

但是,我似乎无法工作。

对于一个分支,我不断收到类似这样的错误,而对于其他分支,则不断收到类似错误。

WARNING: Ref 'refs/remotes/origin/master' is unchanged" 

我运行了最后一个,它经历了所有修订并“看起来”好像在做某事,但是随后我执行了。...

git show <<REVISION_HASH_NUM>>:file_to_remove.py 

这表明该文件仍在提交历史记录中。同样,我对该文件的Git提交历史仍在TFS中显示。

此外,有247个提交和16个以上的其他开发人员使用此存储库。我不能推销Master分支。

P.S。请不要向我推荐其他Stack Overflow帖子。我已经研究了其中大多数。另外,请不要说重述我的问题。如果我足够知道正确地提出问题,那么我就会自己解决。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

拳头:BFG Repo-Cleaner是比git filter-branch更简单的工具-git filter-branch的手册中已经提到过。该工具使删除对象更加容易。

第二:您的测试

git show <<REVISION_HASH_NUM>>:file_to_remove.py 

有缺陷:即使在过滤后,现有提交的内容也不会更改。相反,filter-branch创建新的提交,并因此创建新的哈希。同样,旧的提交不会立即删除-从重写的分支和标签中无法访问它们。过了一会儿,他们被垃圾收集了。

因此,一个简单的测试就是使用选项--no-hardlinks克隆您的仓库,并检查那里的历史记录。

第三:

  

此外,有247个提交和16个以上的其他开发人员使用此存储库。我不能推销Master分支。

没有机会-提交的内容与哈希绑定,反之亦然。如果更改内容,则更改哈希-您正在“重写历史记录”(Google搜索字词)。这16个以上的开发人员会讨厌您:-)

答案 1 :(得分:0)

您在问题中列出的那些命令的问题在于,您可能知道,它们都在本地分支上运行。您可以重写本地git存储库以删除有问题的文件,但这将使远程存储库保持不变。

这就是问题所在:如何编辑远程存储库,而不会弄乱从该远程存储库中提取的其他用户。

不幸的是,这无法完成。 git存储库中的每个提交都基于先前的提交,并取决于该提交的内容。因此,即使在历史记录中某个地方进行了微小的更改就重写了一个提交,也意味着对之后的所有提交进行了更改。

这不是什么大问题,除了每个克隆该远程存储库的人都有该存储库的副本之外,如果您在远程计算机上更改了一系列提交,那么他们所拥有的不再匹配在遥控器上。我敢肯定,其他人可以对这种情况下发生的情况提供更详细的技术描述,但足以说明这会破坏其他16个开发人员的本地副本中的每一个。