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

Car*_*ijn 6 git smartgit git-rewrite-history git-filter-repo

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

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

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

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

Von*_*onC 6

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

试试看:

--replace-refs update-no-add
# or
--replace-refs delete-no-add
Run Code Online (Sandbox Code Playgroud)

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

  • 只需运行“git filter-repo --replace-refs delete-no-add”就可以了。除了由 filter-repo 创建的那些之外,我没有使用替换引用,并且该命令删除了所有这些 (4认同)
  • 感谢那!到目前为止,我在 https://github.com/newren/git-filter-repo/blob/main/Documentation/git-filter-repo.txt 查看了 filter-repo 的整体文档,但它在这个主题上非常简洁。无论如何,“delete-no-add”和“update-no-add”都会留下存储库,没有任何替换引用的痕迹。看看文档,我想“删除并添加”将删除以前的替换引用,但为当前重写添加新的引用?那么“update-no-add”只会更新现有的,而不会添加新的本身? (3认同)
  • @VonC 现在响应时间很快。1.1m 代表当之无愧! (3认同)
  • @CarlColijn 我认为你对这些选项的解释是正确的。 (2认同)
  • @A.Chiesa 太棒了,干得好!我已将您的评论包含在答案中以获得更多可见性。 (2认同)