我创建了一个沙箱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
让我们获取master
到x
和light
到dark
(我试过foo
到bar
,但因为不工作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
到什么,我们知道失败的独立,但取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
最后一个测试:
$ 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的标签更新代码令人难以置信。
更新了新的有趣的参考位。我将其放入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
让我们获取master
到x
和light
到dark
(我试过foo
到bar
,但因为不工作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
到什么,我们知道失败的独立,但取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
最后一个测试:
$ 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的标签更新代码令人难以置信。