从Git仓库中清除文件失败,无法创建新备份。

151

我尝试通过运行以下命令从远程仓库中删除一个文件:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

但是Git报错:

无法创建新备份。在refs/original/目录下已经存在一个备份。
使用-f参数来强制覆盖备份
rm: 无法删除 /.git-rewrite/backup-refs : 权限不够
rm: 无法删除目录 /.git-rewrite : 目录非空

这是在我已经在Windows上删除了.git-rewrite目录之后发生的。

如何删除那个文件?它是一个29Mb大小的文件,保存在我的代码库里,所以我非常需要将其删除。

我尝试在git rebase -i中删除该提交,但是由于该提交涉及到许多不同的文件,Git报告冲突,我为了安全起见选择了放弃。


1
对于搜索引擎:当您的错误信息是“.git-rewrite already exists,请将其删除”时,这也可能适用。 - Drew Noakes
4个回答

275
您已经执行了 filter-branch 操作。在 filter-branch 操作后,Git 会保留对旧提交的引用,以防出现问题。
您可以在 .git/refs/original/… 中找到这些引用。要么删除该目录及其中的所有文件,要么使用 -f 标志强制 Git 删除旧引用。
git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

11
终于搞定了,谢谢!我确实尝试过使用“-f”标志,但问题在于我把它放在了命令的结尾,例如:HEAD -f。看到你的命令后,我尝试将该标志放在开头,结果成功了!=D - Cardin
12
选项标志(-f)放在引用(HEAD)之前。引用放在最后。 - knittl
@Yaron:哪个错误?我的回答中没有显示git add - knittl
1
@knittl,我不是在提到git add。即使在删除了.git/refs/original/文件夹并在git filter-branch命令中使用了-f标志后,我仍然遇到了与原帖作者相同的错误。在我的情况下,解决方案是删除.git/packed-refs文件。 - Yaron
1
@knittl,我找到了如何解决它,但没有找到问题所在。基本上,我在git rm命令中添加了--ignore-unmatch,然后一切顺利! - Gabrielius
显示剩余8条评论

31

1
这是正确的解决方案来删除备份!删除 .git/refs/original/ 并不能解决问题。 - Erik Koopmans
2
请确保将“master”更改为您要修复的分支,例如我的情况是“develop”。 - Damian Green
使用 git show-ref | awk '/ refs.original.refs/{print$2}' 命令可以找到您的存储库所有备份。 - Dan

5

我曾经遇到过同样的问题,然而上面的答案并没有解决我的问题。因为 .git/refs/original/ 目录已经不存在了。对我来说,解决方案是删除 .git/packed-refs 文件。


同样的问题。然而,没有.git/packed-refs文件,也没有.git/refs中的original文件夹。有人知道吗? - XedinUnknown
通过在命令中添加“-r”标志解决了此处的问题。 - XedinUnknown
这里有同样的问题。删除 packed-refs 解决了问题,但也破坏了我Git目录的其余部分,因此我不得不从备份恢复。 - Kevin Yin

2

在筛选分支命令中添加一项强制要求。


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