当前位置:  开发笔记 > 运维 > 正文

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

如何解决《为什么gitfetch不获取任何标签?》经验,为你挑选了1个好方法。

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

为什么两个标签都没有被获取?基于以下文档,git fetch我希望它们会是:

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

torek.. 5

更新了新的有趣的参考位。我将其放入shell脚本中以便进行测试:

mkdir ttwo && cd ttwo && git init && git remote add one file://[path]

(然后ttwo在运行测试后删除)。

因此,下面的每个测试都在新的empty中运行ttwo。我也在这里使用Git 2.10.1,但是与2.11应该没有显着差异(尽管与仍在某些Linux发行版中发布的Git 1.7相比,绝对有显着差异)。

首先,让我们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

出现了一种模式:我们必须写一些本地引用

让我们获取masterxlightdark(我试过foobar,但因为不工作foo在回购不存在):

$ 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什么,我们知道失败的独立,但取lightdark

$ 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

最后一个测试:

$ git fetch one master light
 * branch            master     -> FETCH_HEAD
 * tag               light      -> FETCH_HEAD
 * [new branch]      master     -> one/master

这并未写入我们的标签,仅写入FETCH_HEAD,以及通常的机会主义远程跟踪分支更新。

底线似乎是,在提供明确的refspec时,我们必须至少写入一个本地ref。无需引用即可进行获取,因为它使用配置文件中的默认引用以及默认标记。使用某些写入到本地ref的refspec进行提取是可行的。使用仅写入的一些refspec进行获取FETCH_HEAD失败。这似乎是一个错误,但尚不清楚Git中代码的意图是什么,并且Git的标签更新代码令人难以置信。



1> torek..:

更新了新的有趣的参考位。我将其放入shell脚本中以便进行测试:

mkdir ttwo && cd ttwo && git init && git remote add one file://[path]

(然后ttwo在运行测试后删除)。

因此,下面的每个测试都在新的empty中运行ttwo。我也在这里使用Git 2.10.1,但是与2.11应该没有显着差异(尽管与仍在某些Linux发行版中发布的Git 1.7相比,绝对有显着差异)。

首先,让我们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

出现了一种模式:我们必须写一些本地引用

让我们获取masterxlightdark(我试过foobar,但因为不工作foo在回购不存在):

$ 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什么,我们知道失败的独立,但取lightdark

$ 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

最后一个测试:

$ git fetch one master light
 * branch            master     -> FETCH_HEAD
 * tag               light      -> FETCH_HEAD
 * [new branch]      master     -> one/master

这并未写入我们的标签,仅写入FETCH_HEAD,以及通常的机会主义远程跟踪分支更新。

底线似乎是,在提供明确的refspec时,我们必须至少写入一个本地ref。无需引用即可进行获取,因为它使用配置文件中的默认引用以及默认标记。使用某些写入到本地ref的refspec进行提取是可行的。使用仅写入的一些refspec进行获取FETCH_HEAD失败。这似乎是一个错误,但尚不清楚Git中代码的意图是什么,并且Git的标签更新代码令人难以置信。

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有