代码之家  ›  专栏  ›  技术社区  ›  davidA

“git fetch--tags”是否包括“git fetch”?

  •  238
  • davidA  · 技术社区  · 15 年前

    git fetch --tags ?

    也就是说,如果我跑了 git fetch——标记 ,是否有理由立即逃跑 git fetch 之后呢?

    那么...怎么样 git pull git pull --tags

    6 回复  |  直到 5 年前
        1
  •  194
  •   hakre    3 年前

    注意:从 git 1.9/2.0 (Q1 2014) , git fetch --tags 获取标签 除了

    要仅获取标记,请执行以下操作:

    git fetch <remote> 'refs/tags/*:refs/tags/*'
    

    详情如下:

    看见 commit c5a84e9 通过 Michael Haggerty (mhagger) :

    以前,fetch's“ --tags “该选项被视为等同于指定参考规范

    refs/tags/*:refs/tags/*
    

    在命令行上; 特别是,它导致了 remote.<name>.refspec

    但是,在不获取其他引用的情况下获取标记并不是很有用,而 除了 其他参考资料。
    因此,更改此选项的语义以执行后者。

    如果用户想要获取 只有 标记,则仍然可以指定显式参照规范:

    请注意,1.8.0.3之前的文档对“的这一方面不明确” fetch --tags “行为。
    Commit f0cb2f1 (2012-12-14) 获取--标记 使文档与旧行为匹配。
    Documentation/fetch-options.txt ).

    请求从远程获取所有标记 除了正在提取的任何其他内容之外 .


    git pull --tags 更为稳健:

    看见 commit 19d122b 通过 Paul Tan ( pyokagan ) ,2015年5月13日。
    (由合并) Junio C Hamano -- gitster -- 在里面 commit cc77b99 ,2015年5月22日)

    pull :删除 --标签 无合并候选项情况下出错

    自从 441ed41 (" git pull——标签 2007-12-28,Git 1.5.4+, git pull——标签 将打印不同的错误消息,如果 git-fetch 未返回任何合并候选项:

    It doesn't make sense to pull all tags; you probably meant:
          git fetch --tags
    

    git-fetch --tags 将覆盖任何 配置了refspec,因此不会有合并候选对象。因此,引入错误消息是为了防止混淆。

    但是, c5a84e9 获取--标记 :获取标签 除了 git fetch——标记 您还将获取标签吗 到任何配置的参照规范。
    --标签 一切都安排好了。因此,这个特殊的错误消息现在无关紧要了。

    为避免混淆,请删除此错误消息。


    Git 2.11+(2016年第4季度) git fetch 速度更快。

    看见 commit 5827a03 (2016年10月13日)由 Jeff King ( peff )
    (由合并) 朱尼奥哈马诺-- 吉斯特 在里面 commit 9fcd144 ,2016年10月26日)

    fetch :使用“快速” has_sha1_file 用于标记跟踪

    当从具有许多与我们正在跟踪的分支无关的标记的远程获取时,我们在过于小心地检查标记指向的对象(我们不打算获取!)是否存在于我们的存储库中时,通常会浪费太多的周期。

    这个补丁教你如何使用,你可以快速牺牲 速度的准确性,以防我们在使用

    Test            HEAD^               HEAD
    ----------------------------------------------------------
    5550.4: fetch   11.21(10.42+0.78)   0.08(0.04+0.02) -99.3%
    

    这仅适用于以下情况:

    1. 客户端有很多包需要制作 reprepare_packed_git() 昂贵(最昂贵的部分是在未排序的列表中查找重复项,目前是二次的)。
    2. 服务器端需要大量标记引用,这些标记引用是自动跟踪的候选对象(即,客户端没有)。 每一个都会触发对包目录的重新读取。
    3. 在正常情况下,客户机将自动跟踪这些标记,在一次大的获取之后,(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
    

    Git2.24(2019年第4季度)增加了另一个优化。

    看见 commit b7e2d8b (2019年9月15日)由 Masaya Suzuki ( draftcode )
    (由合并) 朱尼奥哈马诺-- 吉斯特 -- 在里面 commit 1d8b0df ,2019年10月7日)

    取来 :使用 oidset 保留所需的OID以加快查找速度

    在期间 git获取 ,客户端检查播发标记的OID是否已在获取请求的WARN OID集中。
    此检查是在线性扫描中完成的。
    对于具有大量引用的存储库,重复此扫描需要15分钟以上的时间。

    oid_set 对于其他裁判的OID。

        2
  •  134
  •   Arnold Daniels    9 年前

    注意:此答案仅对git v1.8及更高版本有效。

    • git fetch 获取所有分支头(或由remote.fetch config选项指定的所有分支头)、它们所需的所有提交,以及可从这些分支访问的所有标记。在大多数情况下,所有标记都可以通过这种方式访问。
    • git fetch --tags 获取所有标记,以及它们所需的所有提交。会的

    小结:如果您真的想完全更新,只使用fetch,那么您必须同时执行这两项操作。

    它也不是“两倍慢”,除非你指的是在命令行上键入,在这种情况下,别名解决了你的问题。这两个请求基本上没有开销,因为它们请求的信息不同。

        3
  •  50
  •   davidA    15 年前

    我自己来回答这个问题。

    我已经确定这是有区别的。“git fetch--tags”可能会带来所有的标签,但它不会带来任何新的提交!

    事实证明,必须这样做才能完全“最新”,即在不合并的情况下复制“git拉动”:

    $ git fetch --tags
    $ git fetch
    

    这是一个遗憾,因为它的速度是原来的两倍。如果“git fetch”有一个选项来做它通常做的事情就好了 带上所有的标签。

        4
  •  32
  •   jackotonye Dmit3Y    6 年前

    这里的一般问题是 git fetch 将获得 +refs/heads/*:refs/remotes/$remote/* . 如果这些提交中有任何一个具有标记,那么也将获取这些标记。但是,如果远程上的任何分支都无法访问标记,则不会获取这些标记。

    --tags +refs/tags/*:refs/tags/* . 你 两者兼得。我很确定我会做一个 git fetch && git fetch -t 您可以使用以下命令:

    git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*"
    

    git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*"
    

    这将增加第二个 fetch = .git/config 这个遥控器。


    git fetch -fup origin "+refs/*:refs/*"
    

    就我而言,我想要这些功能

    • 从远程抓取所有头部和标记,以便使用refspec refs/*:refs/*
    • 使用非快进覆盖本地分支和标记 +
    • 如果需要,覆盖当前签出的分支 -u
    • 删除远程数据库中不存在的分支和标记 -p
    • 当然,这是强迫的 -f
        5
  •  11
  •   Tim Visher    15 年前

    git fetch 应该做您想做的事情,即“从远程存储库获取任何新内容,并将其放入本地副本中,而不合并到本地分支”。 git fetch --tags 确实如此,除了它没有得到任何东西,除了新的标签。

    git fetch——标记 绝对不是一个超集 git获取 . 事实恰恰相反。

    git pull 当然,它不过是一种包装 git fetch <thisrefspec>; git merge git获取 ing和 git merge 在你跳到前面之前,我会先打电话给你 吉特拉力 只是因为它能帮助你理解 吉特拉力 首先是做什么。

    也就是说,这种关系与 git获取 . 是的超集 git pull --tags .

        6
  •  3
  •   Stephen Rauch Eugen    6 年前
    git fetch upstream --tags