首页 > 解决方案 > 如何从本地和远程每个分支的 Git 提交历史记录中删除文件?

问题描述

Git新手在这里,

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

我见过的大多数文章和堆栈溢出的东西都指出,这是一种可行的方法:

 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

ETC...

但是,我似乎无法工作。

一方面,对于其他分支,我不断收到类似这样的错误或其他类似错误。

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

我跑了最后一个,它经历了所有的修改,“看起来”像是在做某事,但后来我执行了....

git show <<REVISION_HASH_NUM>>:file_to_remove.py 

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

此外,还有 247 个提交和 16 个以上的其他开发人员使用了这个 repo。我无法对 Master 分支进行核攻击。

PS 请不要向我推荐其他 Stack Overflow 帖子。我已经看过其中的大多数。另外,请不要说要改写我的问题。如果我知道的足够多,可以正确地提出问题,那么我知道的足够多,可以自己解决。

提前致谢!

标签: gittfs

解决方案


git filter-branch拳头:比BFG Repo-Cleaner简单得多的工具- 已经在git filter-branch. 此工具使删除对象变得更加容易。

第二:你的测试

git show <<REVISION_HASH_NUM>>:file_to_remove.py 

有缺陷:即使过滤了现有提交的内容后也没有改变。而是filter-branch创建新的提交并因此创建新的哈希值。旧的提交也不会立即删除——它们只是无法从重写的分支和标签中访问。一段时间后,它们被垃圾收集起来。

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

第三:

此外,还有 247 个提交和 16 个以上的其他开发人员使用了这个 repo。我无法对 Master 分支进行核攻击。

没有机会 - 提交的内容与哈希相关联,反之亦然。如果您更改内容,您会更改哈希 - 您正在“改写历史”(Google 搜索词)。这 16 位以上的开发人员会恨你的 :-)


推荐阅读