我刚刚与我(使用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
像这样的最后一步, 在这里所描述的方法
$ 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
重写所有分支和标签。
它可能保持标签就位在新的历史记录(我没有测试它尚未虽然)
首先,你必须重写标签的支持,例如(如VonC说,通过使用) --all
选项重写所有引用。
如果您有附注的标签 (标签重量级),你必须也使用--tag-name-filter
选项,例如作为--tag-name-filter cat
。 请注意,您无法重写签订标签!
如果要执行是可以做到的变化git filter-branch
,那么你可以使用--tag-name-filter
如上所述。
如果你想要做虽然交互式衍合,你需要别的东西。
两件事可以完成git rebasetags
如果底垫是互动的,你会是bash shell,您可随时改变呈现。 一旦退出,壳牌,这些标记将被恢复。
从这个帖子