Answers:
注意:从git 1.9 / 2.0(Q1 2014)开始,除了在同一命令行中不带选项的情况下,还将git fetch --tags
获取标签。
以前,fetch的“
--tags
”选项被认为等同于指定refspecrefs/tags/*:refs/tags/*
在命令行上;特别是,它导致该
remote.<name>.refspec
配置被忽略。但它并非没有取也是其他参考获取标签是非常有用的,而它是能够抓取代码非常有用,除了其他的引用。
因此,请更改此选项的语义以执行后者。如果用户想要获取唯一的标签,那么它仍然可以指定一个明确的Refspec:
git fetch <remote> 'refs/tags/*:refs/tags/*'
请注意,1.8.0.3之前的文档在
fetch --tags
行为方面没有明确规定。
提交f0cb2f1(2012-12-14)fetch --tags
使文档与旧行为匹配。
此提交更改了文档以匹配新行为(请参阅参考资料Documentation/fetch-options.txt
)。要求除了获取其他内容外,还从远程获取所有标签。
由于Git 2.5(2015年第二季度)git pull --tags
更强大:
参见Paul Tan()提交的commit 19d122b,2015年5月13日。(由Junio C Hamano合并--在cc77b99提交中,2015年5月22日)pyokagan
gitster
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()提交5827a03(2016年10月13日)。(由Junio C Hamano合并--在commit 9fcd144中,2016年10月26日)peff
gitster
fetch
:使用“快速”has_sha1_file
进行标记跟踪当从具有很多与分支无关的标签的远程进行提取时,我们通常会在检查存储库中是否存在由标签指向的对象(我们不会提取!)时浪费了太多的时间。太小心了
此修补程序告诉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()
价格昂贵(最昂贵的部分是在未排序的列表中查找重复项,该列表目前是二次的)。- 您需要在服务器端有大量的标记引用,这些标记可以自动跟踪(即,客户端没有)。每一个都会触发对pack目录的重新读取。
- 在正常情况下,客户端会自动关注这些标签,并且在进行一次大抓取后,(2)将不再正确。
但是,如果这些标记指向的历史与客户端获取的内容断开连接,那么它将永远不会自动关注,并且这些候选对象将在每次获取时对其进行影响。
Git的2.21(2019年2月)似乎已经引入了回归时的配置remote.origin.fetch
是不是默认的('+refs/heads/*:refs/remotes/origin/*'
)
fatal: multiple updates for ref 'refs/tags/v1.0.0' not allowed
Git 2.24(2019年第四季度)添加了另一个优化。
请参阅Masaya Suzuki()的commit b7e2d8b(2019年9月15日)。(由Junio C Hamano合并--在commit 1d8b0df中,2019年10月7日)draftcode
gitster
fetch
:用于oidset
保留想要的OID以便更快地查找在期间
git fetch
,客户端检查广告标记的OID是否已在获取请求的OID集中。
该检查是在线性扫描中完成的。
对于具有大量引用的存储库,重复此扫描需要15分钟以上。为了加快速度,请
oid_set
为其他裁判的OID 创建一个。
git fetch <remote> <branch>
自动跟踪标签行为的可能性(因为它已经更新了针对原始意图的远程跟踪):public-inbox.org/git/…–
注意:此答案仅对git v1.8及更早版本有效。
在其他答案和评论中已经说了大多数,但这是一个简洁的解释:
git fetch
获取所有分支头(或所有由remote.fetch config选项指定的分支头),它们所需的所有提交以及从这些分支可访问的所有标记。在大多数情况下,所有标签都可以通过这种方式访问。git fetch --tags
获取所有标签,并完成所有必需的提交。即使从提取的标签可以到达分支头,它也不会更新。简介:如果您真的想完全保持最新,仅使用访存,则必须同时进行。
除非您是在命令行中键入,否则它也不会“慢两倍”,在这种情况下,别名可以解决您的问题。发出两个请求基本上没有开销,因为它们正在请求不同的信息。
git remote update
实际上并不能代替git fetch
和git fetch --tags
。 git remote update
尽管会引入新标签,但不会更新已更改的现有标签。仅git fetch --tags
将更新现有标签。
我将自己回答。
我确定有区别。“ git fetch --tags”可能会引入所有标签,但不会带来任何新的提交!
事实证明,必须完全做到“最新”,即在没有合并的情况下复制了“ git pull”:
$ git fetch --tags
$ git fetch
真可惜,因为速度慢了两倍。如果只有“ git fetch”可以选择执行其通常的操作并引入所有标签。
git remote update myRemoteRepo
':那将获取远程内容和标签?
git fetch
一直在做,它始终拉下所有新提交和新标签。您正在运行什么版本的Git?
git fetch
不会获取不在分支的提交日志中的标签。jQuery UI例如在release标签上执行此操作。我们执行一个git checkout -b temp-branch
,进行发布,添加发布所需的文件,更新版本等,然后git commit -m "1.10.x" ; git tag 1.10.x; git push --tags
删除本地temp分支。没有到达该标签的远程分支,git fetch
也永远不会下载它。
这里的一般问题是git fetch
将获取+refs/heads/*:refs/remotes/$remote/*
。如果这些提交中的任何一个具有标签,那么这些标签也将被获取。但是,如果遥控器上的任何分支都无法访问这些标签,则不会提取它们。
该--tags
选项将refspec切换为+refs/tags/*:refs/tags/*
。您可以要求git fetch
同时抓住两者。我敢肯定,git fetch && git fetch -t
您只需使用以下命令即可:
git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*"
而且,如果您想将此版本设置为此仓库的默认设置,则可以在默认获取中添加第二个refspec:
git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*"
这将为此遥控器添加第二fetch =
行.git/config
。
我花了一段时间寻找项目处理方式。这就是我想出的。
git fetch -fup origin "+refs/*:refs/*"
就我而言,我想要这些功能
refs/*:refs/*
+
在refspec之前使用非快进覆盖本地分支和标记-u
-p
-f
--tags
选项将refspec切换为+refs/tags/*:refs/tags/*
”。尽管man git-fetch
似乎指定了refspec而不带前导+
(refs/tags/*:refs/tags/*
)。
remote.origin.fetch
默认为 +refs/heads/*:refs/remotes/origin/*
,即+
版本,不是吗?(这意味着,无论原点/分支现在在本地何处,原点/分支都将被覆盖。)
git --tags
都在获取标签。请参阅@VonC的答案。
在大多数情况下,git fetch
应该做您想做的事情,即“从远程存储库中获取任何新内容,并将其放入本地副本中而不合并到本地分支机构中”。 git fetch --tags
完全可以做到这一点,除了它除了新标签之外什么也没有。
从这个意义上讲,git fetch --tags
绝不是的超集git fetch
。实际上恰恰相反。
git pull
当然,不过是的包装git fetch <thisrefspec>; git merge
。建议您在开始使用之前先习惯于手动操作git fetch
,因为这首先可以帮助您了解正在做的事情。git merge
git pull
git pull
话虽如此,其关系与完全相同git fetch
。 git pull
是的超集git pull --tags
。
git pull
并没有获得所有标签,而只有从当前分支头可访问的标签。但是,将git pull --tags
获取所有标签,并且显然等效于git fetch --tags
。
git fetch upstream --tags
效果很好,它只会获取新标签,而不会获取任何其他代码库。
upstream
通常称为origin
。我认为upstream
是GitHub使用的名称。无论如何,要使用的名称都是由表示的名称git remote
。