无法重写分支:您有未提交的更改。

5

我想根据git文档,从git历史记录中删除一些文件/文件夹,但由于存在未提交的更改,它失败了。我不清楚可能有哪些未提交的更改,因为我之前使用了 git add --all、提交和push。请注意,要删除的文件夹somefolder/在HEAD中不存在了。它是在早期的提交中移动的,但它的旧版本需要从仓库中清除。

~$ git add --all
~$ git commit -m "trying to fix 'Cannot rewrite branches: You have unstaged changes'"
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
~$ git push
Everything up-to-date
~$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean
~$ git filter-branch --force --index-filter   "git rm --cached --ignore-unmatch somefolder/"   --prune-empty --tag-name-filter cat -- --all
Cannot rewrite branches: You have unstaged changes.
~$ 

我该如何修复这个问题,以便我能够成功运行最后一个命令?


1
git status 的输出是什么? - Cameron Little
1个回答

2
首先,请确保使用最新的Git(2.26),因为旧版本的Git存在关于git filter-branch的错误。
其次,您可能希望将您的存储库克隆为裸存储库,并在那里进行过滤。这将防止任何未暂存的更改,因为裸存储库没有工作树。
但是第三点,不要使用过时的BFG或git filter-branch进行此操作。使用新工具git filter-repo(直接在您的常规本地存储库中,尽管在进行此类过滤之前备份始终是一个好主意)
使用路径过滤:
git filter-repo --path somefolder/ --invert-paths

这将从Git仓库历史记录中删除somefolder/

感谢您的全面回答。我遇到了一些问题,例如 git-filter-repo 要求在“filter”之前加上破折号,并且随后的推送被拒绝,因为远程包含您正在进行的工作。我可以使用“--force”标志来解决这个问题。然而,最终我成功地将特定文件夹从 git 历史记录中删除了。当我将更改拉回我的原始本地存储库时,我还遇到了“fatal: refusing to merge unrelated histories”的错误。我也会解决这个问题。 - Dr-Nuke

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