使 git `replace` 提交永久(或类似)

Make git `replace` commits permanent (or such)

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

filter-repo 工作得很好(具有 Python 脚本功能,而且它比 filter-branch 快得多),但它会创建替换提交。回购重组完成后,我想再次摆脱所有这些替换提交,以真正烘烤更改后的历史。最好通过脚本,因为我有很多回购协议和很多提交。然而,当我在谷歌上搜索如何做到这一点时,我却空手而归......

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

我已经找到了解决方法,将每个存储库推送到添加到本地 Gitea 服务器的空存储库,然后删除本地存储库并将其克隆回本地。虽然我可以在接下来的转换过程中忍受这一点,但我一直想知道我是否 can/could 做得更有效率?

如果 refs/replace-refs 有问题,您可以 运行 您的 filter-repo 命令与
--replace-refs option.

试试:

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

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

A. Chiesa confirms in :

Simply running git filter-repo --replace-refs delete-no-add worked in my case.
I had no usages of replace refs, except for the ones created by filter-repo, and the command gets rid of all of those.