首页 > 解决方案 > git mirror 没有历史记录,但有标签

问题描述

出于某种原因,我想创建一个没有历史但保留标签的项目的 git 镜像。

例如:

History: A-B-C-D-E-F-G-H
           |     |   |  
Tags:      1     2   3

镜像此存储库后,它应该看起来像

History: B-E-G
         | | |
         1 2 3

也许还需要从[B|E|G]其他一些消息中创建,最可能与标签相同(如果需要)。

有什么方法可以直接使用 git 执行此操作,还是我必须编写脚本?我的想法是,从最近的标签开始,我只是将历史重新定位到下一个标签。在两个标签之间合并时这也可能吗?

标签: git

解决方案


通常,一次移动多个引用的最简单方法(即使这只是一个分支并且该分支可以访问的标签)是使用git filter-branch.

首先,您将使用--commit-filter“跳过”没有标签的提交。您需要一个可以判断脚本是否有标签的脚本。你可以使用类似的东西

git describe --exact-match --tags

如果找到匹配项,它将返回 0(并在标准输出上打印标签名称);因此您的过滤器可以有条件地推迟到commit-treeskip-commit取决于是否找到标签。

然后,您需要添加 a--tag-name-filter cat或类似的东西以使标签实际移动。

有关详细信息,filter-branch请参阅https://git-scm.com/docs/git-filter-branch

这有点像仔细编写一堆变基操作的脚本,用一种自动化的方式来映射标签。它工作得很好,因为您不想更改TREE您保留的提交的内容 (),因此实际上并不需要主要的变基机制。


推荐阅读