Git filter-branch移除文件夹失败。

11

我想从我的git repo中删除一个文件夹的提交记录,所以我使用了以下命令:

git filter-branch --tree-filter 'rm -rf folder' HEAD
git push origin master --force

但是我的git仓库没有任何变化,包含我想要删除的文件夹的提交仍然在git仓库中。

所以我再次尝试,但是出现了以下提示:

.git-rewrite已经存在,请删除它

我不知道还能做什么来永久地从包含该文件夹的所有提交中将其删除。


在特定提交中删除文件并不一定会从存储库中删除该文件,因为该文件仍然存在于早期的提交中。 - Tim Biegeleisen
这是否意味着无法从旧提交中删除文件夹?@TimBiegeleisen - Autodesk
也许我应该只删除那些旧的提交记录?......哈哈 - Autodesk
“git filter-branch”不就是一种重写历史的方式吗? - Autodesk
1
这些文件夹包含敏感文件,但我之前没有注意到并在最近发现之前推送到了git仓库。 - Autodesk
显示剩余2条评论
3个回答

8
为了彻底从git存储库中删除文件或目录,您必须确保不再引用它。
在git中,文件(或blob对象)由树对象引用,该树对象由另一个树对象或提交对象引用。提交对象由分支、标签、reflog等引用。
前段时间,我不得不从项目中完全删除一个文件夹,并写了一篇博客。所以我不想在这里重复自己。只需查看Remove directories and files permanently from git页面。
我还编写了一个使用jgit库的swing应用程序来完成此操作。只需尝试GitDirStat。在进行操作之前先复制当前存储库始终是个好选择。

.git-rewrite已经存在,请删除它

只需按照消息所说的做即可。删除.git-rewrite

提示:您不必使用--tree-filter,索引过滤器会更快。然后,您必须使用git rm -rf --cached


1

我刚刚做了

rm -rf .git-rewrite

它成功了!!


1
注意:下面介绍的操作将覆盖您的git历史记录。如果您不确定自己在做什么,请小心并备份您的代码库。

Git

当您通过filter-branch删除文件夹后,如下:

git filter-branch -f --tree-filter 'rm -rf folder' HEAD

当您将更改推送到存储库(git push origin master --force)时,需要取消引用对象并进行垃圾回收。
要检查指向已删除对象的内容(标签或分支),请使用以下命令:
git for-each-ref --format='delete %(refname)' refs/original

然后,为了遵守您的要求,您需要过期reflog(默认为90天)并强制进行垃圾收集,例如:
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

然后将您的所有分支和标签推送到远程:
git push origin --force --all
git push origin --force --tags

来源:从Git仓库永久删除文件和文件夹


Bfg

如果您想要完全删除特定的文件或文件夹,您可以使用BFG Repo-Cleaner。例如:

$ bfg --delete-folders folder --no-blob-protection my-repo.git

如需更多详细信息,请点击上述链接或访问高级Git / 删除敏感数据 GitHub 页面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接