Git的,主分支和相关联的标志改写历史(Git, rewriting history of mast

2019-09-19 06:21发布

我刚刚与我(使用Git滤波器分支)重写我的回购之一史上第一次经历。 问题是,回购有几个标签,改写后似乎是从历史,导致完全断开。 我认为这是由于这样的事实,与标签相关的历史并没有被改写,因此他们必须指向旧提交。 所以,我有什么办法在新的历史到“应用”的标签。 小ASCII艺术,也许更容易理解我的问题:

原回购:

+  HEAD
|
|
+  TAG 0.2.0
|
|
+  TAG 0.1.0
|
|
+  Initial commit

通过报道回购结构gitk --all历史改写后:

    +  HEAD
    |
    |
    |
    |
    |
    |
    |
    |
    +  Initial commit
+  HEAD
|
|
+  TAG 0.2.0
|
|
+  TAG 0.1.0
|
|
+  Initial commit

Answer 1:

像这样的最后一步, 在这里所描述的方法

$ git log --pretty=oneline origin/releases |
  sed -n -e '/^\([0-9a-f]\{40\}\) Tag\( release\)\? \(.*\)/s--\3|\1|Tag release \3-p'
  > ~/paludis-git-tags

$ while read name msg head ; do
  git tag -m "${msg}" ${name} ${head} ;
  done < paludis-git-tags

这个想法是从旧版本的存储库的读取标签,重新申请他们在新的历史。


注意:您原来使用git的过滤分支的,你使用:

-- --all

--即从分开修订选项过滤器分支选项,以及--all重写所有分支和标签。

它可能保持标签就位在新的历史记录(我没有测试它尚未虽然)



Answer 2:

首先,你必须重写标签的支持,例如(如VonC说,通过使用) --all选项重写所有引用。

如果您有附注的标签 (标签重量级),你必须也使用--tag-name-filter选项,例如作为--tag-name-filter cat 。 请注意,您无法重写签订标签!



Answer 3:

如果要执行是可以做到的变化git filter-branch ,那么你可以使用--tag-name-filter如上所述。

如果你想要做虽然交互式衍合,你需要别的东西。

两件事可以完成git rebasetags

如果底垫是互动的,你会是bash shell,您可随时改变呈现。 一旦退出,壳牌,这些标记将被恢复。

从这个帖子



文章来源: Git, rewriting history of master branch and associated tags