为什么git fetch没有获取任何标签?

时间:2017-01-23 18:56:57

标签: git tags git-fetch

我创建了一个沙箱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

  

默认情况下,还会获取指向要获取的历史记录的任何标记;效果是获取指向您感兴趣的分支的标记。

2 个答案:

答案 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(我尝试foobar,但这不起作用,因为{在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

手动拉出标签