我有一个存储库,它是另一个存储库的持续衍生产品。有时上游会发布新的标记版本,衍生品可能会选择合并和更新以基于该版本。
我原以为,这样做的过程就是:
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变种,我找到了标签的相关哈希,并从该哈希创建了一个临时分支并与之合并,并将我的遥控设置为永不拉标签。
有没有办法在这个特定用例中理智地管理标签?或者标签永远被绑定为特殊的“全局”对象,这些对象无法以任何有意义的方式进行命名空间?
答案 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/
的轻微烦恼之外一直以来。