git镜像没有历史记录,但有标签

时间:2018-06-07 14:06:14

标签: git

出于某种原因,我想创建一个没有历史但保留标签的项目的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做这个或者我必须编写脚本吗? 我的想法是,从最新的标签开始,我只是将历史记录缩小到下一个标签。在两个标签之间合并时,这也是可能的吗?

1 个答案:

答案 0 :(得分:0)

一般来说,一次移动多个引用的最简单方法(即使只是一个分支和该分支可以访问的标记)将使用git filter-branch

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

这样的东西
git describe --exact-match --tags

如果找到匹配,它将返回0(并在stdout上打印标签名称);因此,根据是否找到代码,您的过滤条件可以有条件地推迟到commit-treeskip-commit

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

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

这有点类似于仔细编写一堆rebase操作,并使用自动方式映射标记。它运行良好是因为您不想更改所保留的提交的内容(TREE),因此不需要主要的rebase机制。