出于某种原因,我想创建一个没有历史但保留标签的项目的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做这个或者我必须编写脚本吗? 我的想法是,从最新的标签开始,我只是将历史记录缩小到下一个标签。在两个标签之间合并时,这也是可能的吗?
答案 0 :(得分:0)
一般来说,一次移动多个引用的最简单方法(即使只是一个分支和该分支可以访问的标记)将使用git filter-branch
。
首先,您将使用--commit-filter
来“跳过”没有标记的提交。您需要一个可以判断脚本是否有标记的脚本。你可以使用像
git describe --exact-match --tags
如果找到匹配,它将返回0(并在stdout上打印标签名称);因此,根据是否找到代码,您的过滤条件可以有条件地推迟到commit-tree
或skip-commit
。
然后,您需要添加--tag-name-filter cat
或类似的东西,以使标签实际移动。
有关filter-branch
的详细信息,请参阅https://git-scm.com/docs/git-filter-branch
这有点类似于仔细编写一堆rebase操作,并使用自动方式映射标记。它运行良好是因为您不想更改所保留的提交的内容(TREE
),因此不需要主要的rebase机制。