git - 无法重写分支:您有未暂存的更改
问题描述
我想根据git 文档从 git 历史记录中删除一些文件/文件夹,但由于unstaged changes
. 我不清楚像我之前所做的那样,有哪些未分阶段的更改 git add --all
,提交和推送。请注意,待删除文件夹somefolder/
不再存在于 HEAD 中。它在较早的提交中被移动,但它的旧版本需要从 repo 中清除。
~$ 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.
~$
我该如何解决这个问题,以便我可以成功运行最后一个命令?
解决方案
首先,确保使用最新的 Git (2.26),因为旧版 Git 中存在关于git filter-branch的错误。
其次,您可能希望将您的存储库克隆为裸存储库,并在那里进行过滤。这将防止任何未暂存的更改,因为裸存储库没有工作树。
但是第三,不要使用过时的 BFG 或git filter-branch
为此。
使用新工具git filter-repo
(直接在您的常规本地存储库中,尽管在进行此类过滤之前备份总是一个好主意)
使用路径过滤:
git filter-repo --path somefolder/ --invert-paths
somefolder/
这将从Git 存储库历史记录中删除。
推荐阅读
- prolog - 纯 Prolog δλ-微积分等式
- diff - 如何在 ed 中使用 diff3
- python - 如何合并索引相同的数据帧的行
- android - Flutter:搜索栏底部溢出 38 个像素
- batch-file - 使用 Batch,我如何打开 CSGO 武器检查 URL?
- r - rxLinMod 和 lm() 不一致。为什么要删除其中一个系数?
- c++ - 我可以安全地使用 C++ STL 向量元素的地址吗?如何?
- powershell - Powershell脚本将自身复制到另一个位置
- python - 用于登录python的线程
- discord.js - 试图获取置顶消息的作者、内容和用户?