我创建了一个沙箱git存储库,其中包含一些提交和几个标记,一个是轻量级的,另一个是注释的:
> mkdir one; cd one; git init
> touch a.txt; git add a.txt; git commit -m"a.txt"
> touch b.txt; git add b.txt; git commit -m"b.txt"
> git tag light
> touch c.txt; git add c.txt; git commit -m"c.txt"
> git tag -a annot -m"annot"
我现在创建第二个存储库并从第一个存储库获取:
> mkdir two; cd two; git init
> git remote add one <...>/one
> git fetch one master
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 9 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From <...>/one
* branch master -> FETCH_HEAD
* [new branch] master -> one/master
为什么没有提取任何标签?我预计它们会基于the documentation for git fetch
:
默认情况下,还会获取指向要获取的历史记录的任何标记;效果是获取指向您感兴趣的分支的标记。
答案 0 :(得分:4)
更新了新的有趣信息位。我将它放入shell脚本中以便于测试:
mkdir ttwo && cd ttwo && git init && git remote add one file://[path]
(然后在运行测试后删除ttwo
。)
因此,下面的每个测试都在新的空ttwo
中运行。我也在这里使用Git 2.10.1,但是与2.11应该没有显着差异(虽然与Git 1.7相比肯定存在显着差异,Git 1.7仍然在某些Linux发行版中发布......)。
首先,让我们git fetch
与否 refspecs:
$ git fetch one
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 8 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (8/8), done.
From file://[path]
* [new branch] master -> one/master
* [new tag] annot -> annot
* [new tag] light -> light
这是使用Git版本2.10.1,两个存储库位于同一台计算机上,并使用file:///home/...
或/home/...
。根据需要,两次提取(rm -rf texp2
)都会获取两个标记。
现在让我们使用单个refspec master
运行它。从这里开始,我将省略remote:
到From:
的内容,只显示哪些分支和/或代码会更新:
$ git fetch one master
[snip]
* branch master -> FETCH_HEAD
* [new branch] master -> one/master
如果我们使用master:master
会发生什么,这需要添加--update-head-ok
:
$ git fetch one --update-head-ok master:master
* [new branch] master -> master
* [new tag] annot -> annot
* [new branch] master -> one/master
* [new tag] light -> light
啊哈,现在我们得到了标签!
如果我们抓取master
但将其写入refs/remotes/origin/master
,会发生以下情况:
$ git fetch one master:refs/remotes/origin/master
* [new branch] master -> origin/master
* [new tag] annot -> annot
* [new branch] master -> one/master
* [new tag] light -> light
让我们将master
提取到x
,将light
提取到dark
(我尝试foo
到bar
,但这不起作用,因为{在repo one中不存在{1}}:
foo
现在让我们将<{1}}提取到 nothing ,我们知道这些是独立的,但是将$ git fetch one master:x light:dark
* [new branch] master -> x
* [new tag] light -> dark
* [new tag] annot -> annot
* [new tag] light -> light
* [new branch] master -> one/master
提取到master
:
light
最后一次测试:
dark
这不会写入我们的标签,只会写入$ git fetch one master light:dark
* branch master -> FETCH_HEAD
* [new tag] light -> dark
* [new tag] annot -> annot
* [new tag] light -> light
* [new branch] master -> one/master
,加上通常的机会性远程跟踪分支更新。
最重要的是,在给出明确的refspec时,我们必须编写至少一个本地引用。使用 no refspecs获取有效,因为它使用配置文件中的默认refspecs加上默认标记。获取一些写入本地ref的refspec。使用仅写入$ git fetch one master light
* branch master -> FETCH_HEAD
* tag light -> FETCH_HEAD
* [new branch] master -> one/master
的一些refspec获取失败。这似乎是一个错误,但目前尚不清楚Git中代码的意图是什么,而且Git的标签更新代码非常曲折。
答案 1 :(得分:1)
这不是一个正确的答案,但我通过Google搜索到达了这里,因为git fetch
并未提取我的标签(通常是这样做)。因此,这适用于同一条船上偶然遇到这个措辞非常相似的问题的其他人。
我能够使用git fetch --tags