管理git远程标签

时间:2014-03-24 06:25:24

标签: git git-tag

我有一个存储库,它是另一个存储库的持续衍生产品。有时上游会发布新的标记版本,衍生品可能会选择合并和更新以基于该版本。

我原以为,这样做的过程就是:

git remote add upstream <url>
git fetch upstream --tags --prune
git merge upstream/<tagname> myintegrationbranch

但是这给了我自己标签列表中上游的所有标签。如果我的衍生项目有一个与上游相同的标签,就会发生撕裂。

我做过一些关于refspec的事情,最有趣的是:

[upstream]
    ...
    fetch = refs/tags/*:refs/tags/upstream/*

这给了我所有标签的副本,即upstream/<tagname><tagname>

我在这个阶段的追索似乎是icky变种,我找到了标签的相关哈希,并从该哈希创建了一个临时分支并与之合并,并将我的遥控设置为永不拉标签。

有没有办法在这个特定用例中理智地管理标签?或者标签永远被绑定为特殊的“全局”对象,这些对象无法以任何有意义的方式进行命名空间?

1 个答案:

答案 0 :(得分:0)

如图所示,您可以省略--tags并将其所有标记置于本地标记名称空间下方upstream/<tag>。您可以按名称引用这些内容:如果他们有标记v7.12,您现在有一个标记upstream/v7.12。只要您没有为自己的任何标记upstream/命名,就不会与他们的标记发生冲突。


如果你这样做:

[upstream]
    url = ...
    fetch = +refs/heads/*:refs/remotes/upstream/*
    fetch = +refs/tags/*:refs/rtags/upstream/*

你仍然可以运行git fetch upstream --prune。这将使所有分支进入refs/remotes/upstream/下的存储库(即远程分支),以及refs/rtags/upstream/下的所有标记(即,git没有内置的东西:&#34; remote标记&#34;。)

每当他们添加或删除标记时,新标记或已删除标记都会被复制到您的rtags/空间。

由于这不是内置于git中,而是通过&#34;远程标记&#34;来检查。你必须拼写出来的参考:

git checkout rtags/upstream/foo

如果您有本地分支b并希望与&#34;远程标记&#34;合并upstream/v7.12

git checkout b
git merge rtags/upstream/v7.12

要列出&#34;远程标签&#34;,请使用git for-each-ref(您可能需要一个自定义脚本,这只是风味的一个副手示例):

#! /bin/sh
# list remote tags from all remotes that have them
show_tag() {
    local rmt=$1 tag=$2 ttype=$3 sha1=$4

    case $ttype in
    commit) echo "$rmt: $tag -> $sha1 (lightweight tag)";;
    tag) echo "$rmt: $tag -> $sha1 (annotated tag)";;
    *) echo "$rmt: $tag -> $sha1 ($ttype)"; # some joker tagged a tree or blob
    esac
}
git for-each-ref refs/rtags |
while read sha1 rtype rname; do
    rname=${rname#refs/rtags/}   # strip off refs/rtags/
    rmt=${rname%%/*}             # name of remote
    rtag=${rname#*/}             # tag on remote
    show_tag $rmt $rtag $rtype $sha1
done

我不是非常使用标签,实际上并没有足够实现这一点,但它非常简单,应该可以工作(除了必须写出rtags/的轻微烦恼之外一直以来。