[英]Git, rewriting history of master branch and associated tags
我刚刚第一次重写了我的一个repos的历史(使用git-filter-branch)。 问题是repo有几个标签,重写之后似乎与结果历史完全断开。 我认为这是因为与标签相关的历史记录没有被重写,所以他们必须指向旧的提交。 那么,我可以做些什么来“应用”新历史上的标签。 一点点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-filter-branch中,你使用了:
-- --all
?
--
将过滤器分支选项与修订选项分开,--
--all
重写所有分支和标签。
它可能已将标记保留在新历史记录中(我还没有测试过它)
首先,你必须重写标签 ,例如(如VonC所说 ),使用--all
选项重写所有引用。
如果您有注释标签 (重量级标签),您还必须使用--tag-name-filter
选项,例如--tag-name-filter cat
。 请注意,您无法重写签名标签!
如果要执行可以使用git filter-branch
完成的更改,则可以使用--tag-name-filter
,如上所述。
如果你想进行交互式变基,你还需要其他东西。
这两件事都可以使用git rebasetags
完成
如果rebase是交互式的,您将看到一个bash shell,您可以在其中进行更改。 退出该shell后,将恢复标记。
从这篇文章
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.