首页 > 解决方案 > 使 git `replace` 提交永久(或类似)

问题描述

我正忙着将我所有现有的 SVN 存储库转换为 Git,同时也借此机会利用 Git 轻松重写一些历史的能力。为此,我还使用 git filter-repo 来删除不需要的文件并通过脚本进行一些标准重命名。(注意:它们都是只有我工作的单独存储库,所以不需要更改历史的免责声明,我知道警告:))

filter-repo工作得很好(使用 Python 脚本功能加上它比 filter-branch 快得多),但它会创建替换提交。一旦回购重组完成,我想再次摆脱所有这些替换提交,以真正融入改变的历史。最好是通过脚本,因为我有很多带有很多提交的 repos。然而,当我在谷歌上搜索如何做到这一点时,我空手而归......

这样做的原因:我的 Git 命令行客户端并没有为此烦恼,但我的 GUI(Windows 版 SmartGit)一直唠叨说它不支持替换提交(它检测到它说的 refs/replace-refs)。无论如何,它会显示 repo 内容,我可以从那里继续填写丢失的提交消息,进行更多清理等,但我还没有进一步看,所以谁知道它最终会破坏什么?

我已经找到了一种解决方法,将每个 repo 推送到添加到本地 Gitea 服务器的空 repo,然后删除本地 repo 并将其克隆回本地。虽然我可以在剩下的转换旅程中忍受它,但我一直想知道我是否可以/可以做得更有效?

标签: gitsmartgitgit-rewrite-historygit-filter-repo

解决方案


如果refs/replace-refs有问题,您可以使用选项filter-repo运行命令。
--replace-refs

试试看:

--replace-refs update-no-add
# or
--replace-refs delete-no-add

看看执行后是否还有refs/replace-refs对象filter-repo

A. Chiesa在评论中确认:

git filter-repo --replace-refs delete-no-add在我的情况下,简单地运行。
我没有使用 replace refs,除了由 创建的那些filter-repo,并且该命令摆脱了所有这些。


推荐阅读