我想从我的git repo上的提交中删除一个文件夹,所以我使用这个推荐:
AsyncTask
但我的git repo没有任何变化,那些包含我想删除的文件夹的提交仍然在git repo上。
所以我再试一次,但有显示:
.git-rewrite已存在,请将其删除
我不知道还能做些什么来将其从包含git repo永久文件夹的所有提交中删除。
答案 0 :(得分:5)
为了从git存储库中完全删除文件或目录,您必须确保它不再被引用。
在git中,文件(或blob对象)由树对象引用,该树对象由另一个树对象或提交对象引用。提交对象由分支,标记,reflog等引用。
前段时间我不得不从项目中删除一个文件夹并写了一篇关于它的博客。所以我不想在这里重复一遍。只需查看Remove directories and files permanently from git页面。
我还写了一个使用jgit
库的swing应用程序。试试GitDirStat。以前制作当前回购的副本总是一个不错的选择。
.git-rewrite已存在,请将其删除
按照消息所说的做。删除.git-rewrite
。
PS:您不必使用--tree-filter
索引过滤器可以更快地执行此操作;)然后您必须使用git rm -rf --cached
。
答案 1 :(得分:0)
注意:下面显示的操作将覆盖您的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
来源:Permanently remove files and folders from Git repo
或者,要完全删除特定文件或文件夹,您可以使用BFG Repo-Cleaner。例如:
$ bfg --delete-folders folder --no-blob-protection my-repo.git
有关详细信息,请点击上面的链接或Advanced Git / Remove sensitive data GitHub页面。
答案 2 :(得分:0)
我刚刚做了
rm -rf .git-rewrite
它奏效了!!