“git fetch -tags”包含“git fetch”吗?
一个不错的和简单的问题 – 是“git fetch” git fetch --tags
集的git fetch --tags
吗?
也就是说,如果我运行git fetch --tags
,是否有任何理由立即直接运行git fetch
?
怎么样git pull
和git pull --tags
? 同样的情况?
注意:从git 1.9 / 2.0(2014年第1季度)开始 , git fetch --tags
除了获取相同的命令行而没有选项的内容之外, git fetch --tags
获取标签。
参见Michael Haggerty的 提交c5a84e9 (mhagger) :
以前,提取的“
--tags
”选项被认为等同于指定--tags
refs/tags/*:refs/tags/*
在命令行上; 尤其是它导致
remote.<name>.refspec
configuration被忽略。但是取得标签并不会取得其他引用,这是非常有用的,但除了其他引用之外,取得标签是非常有用的。
所以改变这个选项的语义来做后者。如果用户只想获取标签,那么仍然可以指定一个明确的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
更强大:
请参阅2015年5月13日的Paul Tan( pyokagan
) 提交的19d122b 。
(由Junio C gitster
合并- gitster
-在cc77b99提交 ,2015年5月22日)
pull
:删除 –--tags
错误在没有合并的候选人的情况下因为441ed41 (“
git pull --tags
”:出错信息更好,2007-12-28,Git 1.5.4+),如果git-fetch
没有返回,那么git pull --tags
会打印一个不同的错误信息任何合并人选:It doesn't make sense to pull all tags; you probably meant: git fetch --tags
这是因为在那个时候,
git-fetch --tags
会覆盖任何configuration的git-fetch --tags
,因此不会有合并候选。 错误信息是这样引入的,以防止混淆。然而,由于c5a84e9 (
fetch --tags
: 除了其他东西,取得标签,2013-10-30,Git 1.9.0+),除了任何configuration的refspecs外,git fetch --tags
还会获取标签。
因此,如果没有合并候选人的情况发生,这不是因为 –--tags
被设置。 因此,这个特殊的错误信息现在是不相关的。为防止混淆,请删除此错误消息。
使用Git 2.11+(Q4 2016) git fetch
更快。
见Jeff King( peff
)的 提交5827a03 (2016年10月13日) 。
(由Junio C gitster
合并- gitster
– in commit 9fcd144 ,2016年10月26日)
fetch
:使用“quick”has_sha1_file
作为标签后续当从具有许多与我们所关注的分支无关的标签的远程获取数据时,在检查标签指向的对象(我们不会获取!)时,我们曾经浪费太多的周期太仔细了
这个补丁教导提取使用HAS_SHA1_QUICK牺牲速度的准确性,在情况下,我们可能会同时重新打包。
这里是包含的perf脚本的结果,它build立了一个类似于上面描述的情况:
Test HEAD^ HEAD ---------------------------------------------------------- 5550.4: fetch 11.21(10.42+0.78) 0.08(0.04+0.02) -99.3%
这仅适用于以下情况:
- 你在客户端有很多的包使得
reprepare_packed_git()
昂贵(最昂贵的部分是在一个未sorting的列表中查找重复项,这个列表当前是二次的)。- 在服务器端需要大量的标签引用,这些标签引用是自动跟踪(即,客户端不具备)的候选对象。 每一个触发重新读取包目录。
- 在正常情况下,客户端会自动跟踪这些标签,并且在一次大的获取之后,(2)将不再是真实的。
但是,如果这些标签指向与客户端提供的内容断开连接的历史logging,那么它将永远不会自动跟随,而这些候选对象每次都会影响它。
注意:这个答案只适用于git v1.8及以上版本。
其他大部分的答案和评论都是这样说的,但是这里有一个简洁的解释:
-
git fetch
获取所有分支头(或者由remote.fetchconfiguration选项指定的所有分支头),它们所需的所有提交以及从这些分支可到达的所有标签。 在大多数情况下,所有标签都可以通过这种方式到达。 -
git fetch --tags
提取所有标签,所有提交都需要提交。 它不会更新分支头,即使它们可以从被取出的标签中获得。
总结:如果你真的想要完全保持最新,只使用获取,你必须同时做。
这也不是“慢两倍”,除非你的意思是在命令行input,在这种情况下别名解决你的问题。 提出这两个要求基本上没有开销,因为他们要求不同的信息。
我将自己回答这个问题。
我确定有一个区别。 “git fetch –tags”可能会带来所有的标签,但不会带来任何新的提交!
原来一个人必须这样做是完全“最新的”,即复制一个“混帐”没有合并:
$ git fetch --tags $ git fetch
这是一个耻辱,因为它慢了一倍。 如果只有“git fetch”有一个选项来做它通常做的事情, 并带来所有的标签。
这里的一般问题是, git fetch
将获取+refs/heads/*:refs/remotes/$remote/*
。 如果这些提交中有任何标签,那么这些标签也将被提取。 但是,如果远程的任何分支都不能访问标签,则不会被提取。
--tags
选项将--tags
切换到+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/*
这将在这个远程的.git/config
添加第二个fetch =
行。
我花了一段时间寻找处理这个项目的方式。 这是我想出来的。
git fetch -fup origin +refs/*:refs/*
在我的情况下,我想要这些function
- 从远程抓取所有的头和标签,所以使用refspec
refs/*:refs/*
- 在refspec之前用非快进的
+
覆盖本地分支和标签 - 如果需要覆盖当前签出的分支
-u
- 删除远程
-p
不存在的分支和标记 - 并强制确定
-f
在大多数情况下, git fetch
应该做你想做的,就是'从远程仓库获取任何新东西,并把它放在本地副本中,而不合并到你的本地分支“。 git fetch --tags
的确如此,除了它除了新标签之外没有任何东西。
从这个意义上说, git fetch --tags
是git fetch --tags
的超集。 事实上恰恰相反。
git pull
当然不过是git fetch <thisrefspec>; git merge
一个包装git fetch <thisrefspec>; git merge
git fetch <thisrefspec>; git merge
。 build议您在使用git pull
之前,先习惯手动执行git fetch
ing和git merge
因为它可以帮助您理解git pull
在做什么。
这就是说,这个关系和git fetch
完全一样。 git pull
是git pull --tags
的超集。