注意:以git 1.9/2.0 (Q1 2014) 开头,git fetch --tags 获取标签除了没有选项的同一命令行获取的内容。
仅获取标签:
git fetch <remote> 'refs/tags/*:refs/tags/*'
详细说明:
见commit c5a84e9Michael Haggerty (mhagger):
以前,fetch 的“--tags”选项被认为等同于指定 refspec
refs/tags/*:refs/tags/*
在命令行上;
特别是,它导致remote.<name>.refspec 配置被忽略。
但是在不获取其他引用的情况下获取标签并不是很有用,而 能够获取标签以及其他引用非常有用。
所以改变这个选项的语义来做后者。
如果用户想获取 only 标签,那么仍然可以指定显式 refspec:
git fetch <remote> 'refs/tags/*:refs/tags/*'
请注意,1.8.0.3 之前的文档对“fetch --tags”行为的这一方面不明确。
Commit f0cb2f1 (2012-12-14) fetch --tags 使文档与旧行为匹配。
此提交更改文档以匹配新行为(请参阅Documentation/fetch-options.txt)。
请求从远程获取所有标签以及正在获取的任何其他标签。
由于 Git 2.5(2015 年第二季度)git pull --tags 更加强大:
参见commit 19d122bPaul Tan (pyokagan),2015 年 5 月 13 日。
(由 Junio C Hamano -- gitster -- 合并,commit cc77b99,2015 年 5 月 22 日)
pull:在没有合并候选的情况下删除 --tags 错误
由于441ed41 ("git pull --tags": 错误输出更好的消息。,
2007-12-28,Git 1.5.4+),git pull --tags 将打印不同的错误消息,如果
git-fetch 没有返回任何合并候选者:
It doesn't make sense to pull all tags; you probably meant:
git fetch --tags
这是因为当时git-fetch --tags 会覆盖任何
配置了 refspecs,因此不会有合并候选者。因此引入了错误消息以防止混淆。
但是,由于c5a84e9(fetch --tags:获取标签除了
其他东西,2013-10-30,Git 1.9.0+),git fetch --tags 会另外获取标签
到任何已配置的 refspecs。
因此,如果出现任何没有合并候选者的情况,并不是因为设置了--tags。因此,这个特殊的错误信息现在已经无关紧要了。
为防止混淆,请删除此错误消息。
使用 Git 2.11+(2016 年第四季度)git fetch 更快。
参见Jeff King (peff) 的commit 5827a03(2016 年 10 月 13 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 9fcd144,2016 年 10 月 26 日)
当从具有许多与我们所遵循的分支无关的标签的远程获取时,我们在检查标签指向的对象(我们不会获取!)是否存在时浪费了太多的周期在我们的存储库中太小心了。
这个补丁教 fetch 使用 HAS_SHA1_QUICK 牺牲
速度的准确性,在我们可能对
同时重新包装。
以下是包含的 perf 脚本的结果,该脚本设置了与上述类似的情况:
Test HEAD^ HEAD
----------------------------------------------------------
5550.4: fetch 11.21(10.42+0.78) 0.08(0.04+0.02) -99.3%
这仅适用于以下情况:
- 您在客户端有很多包使
reprepare_packed_git() 变得昂贵(最昂贵的部分是在未排序的列表中查找重复项,目前是二次的)。
- 您需要在服务器端有大量标签引用作为自动跟随的候选对象(即客户端没有)。
每一个都会触发对包目录的重新读取。
- 在正常情况下,客户端会自动跟踪这些标签,并且在一次大抓取之后,(2) 将不再正确。
但是,如果这些标签指向的历史与客户端获取的内容断开连接,那么它将永远不会自动跟踪,并且这些候选者会在每次获取时影响它。
Git 2.21(2019 年 2 月)似乎在 config remote.origin.fetch is not the default one ('+refs/heads/*:refs/remotes/origin/*') 时引入了回归
fatal: multiple updates for ref 'refs/tags/v1.0.0' not allowed
Git 2.24(2019 年第四季度)增加了另一项优化。
参见Masaya Suzuki (draftcode) 的commit b7e2d8b(2019 年 9 月 15 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 1d8b0df,2019 年 10 月 7 日)
fetch:使用 oidset 保留需要的 OID 以加快查找速度
在git fetch 期间,客户端检查广告标签的 OID 是否已在获取请求的所需 OID 集中。
此检查是在线性扫描中完成的。
对于具有大量引用的存储库,重复此扫描需要 15 分钟以上。
为了加快速度,请为其他裁判的 OID 创建一个 oid_set。