【问题标题】:Git: "+refs/heads/<branch>:refs/remotes/origin/<branch>"Git: "+refs/heads/<branch>:refs/remotes/origin/<branch>"
【发布时间】:2017-12-07 21:58:57
【问题描述】:

Jenkins Git 插件根据我的参考规范在控制台输出中生成了以下命令

  1. 以下两个命令有什么区别?他们的输出看起来几乎没有什么不同。我在下面给出了他们的输出:

    命令 1:

    git fetch --no-tags --progress repo.git <strong><em>+refs/heads/qa:refs/remotes/origin/qa</em></strong> --depth=1

    输出:

    From <repo>
     * [new branch]      qa         -> origin/qa
    

    命令 2:

    git fetch --no-tags --progress repo.git <strong><em>refs/heads/qa</em></strong> --depth=1

    输出:

    From <repo>
     * branch            qa         -> FETCH_HEAD
    
  2. 这里的 FETCH_HEAD 是什么意思?

  3. 我相信refs/heads/qa 是“qa”分支的本地工作副本,refs/remotes/origin/qa 是远程“qa”分支。但是,这个约定意味着什么?

    +refs/heads/qa:refs/remotes/origin/qa

【问题讨论】:

    标签: git


    【解决方案1】:

    由冒号分隔的两个引用的语法是一个refspec。 Refspecs 也可以省略冒号而只包含一个引用,在这种情况下,加号可能(取决于此退化 refspec 的使用)不起作用。有关 refspec 的更多信息,请参阅,例如,What is the difference between these `git fetch` syntaxes?

    不过,以相反的顺序回答问题:

    • 第 3 项完全错误。名称refs/heads/qa分支名称;它只是完整地拼写出来,因为它应该在参考规范中。它根本不是“工作副本”:它只是一个名称。 Git 使用名称(引用)将人类可读的字符串(如 masterqa)映射到 Git 的内部哈希 ID。 reference 一词是分支、标签、远程跟踪分支和其他此类名称的概括。

      同样,refs/remotes/origin/qa 是完整的引用,您的远程跟踪分支通常缩写为 origin/qa。与全名为 refs/heads/qa 的分支一样,Git 使用此名称从人类可读的字符串 origin/qa 映射到哈希 ID。

    • 名称FETCH_HEAD 指的是.git 目录中的一个文件.git/FETCH_HEAD。当您使用非常古老的 git fetch 形式时,在远程跟踪分支发明之前,Git 必须将所有获取的名称和 ID 值存储在某个地方。那个“某处”就是这个文件。然后,其他 Git 命令可以找出每个名称和 ID 对。

      早在 2007 年左右之前,这是您可以使用 git fetch 的唯一方法。之所以发明远程跟踪分支名称,是因为让您自己的 Git 记住这些名称的时间要长得多——每个新的 git fetch 都会覆盖旧数据1,除非你使用 -a——而且在某些方面更容易使用。

    • 对于第1项(有什么区别),请参阅其他答案。


    1如果您只从一个远程(例如,从origin)获取,并且您总是获取所有名称,这实际上是完全合理的行为:覆盖旧的、陈旧的信息与新的、正确的信息。当您从多个遥控器获取和/或零碎地获取项目时,它会崩溃。远程跟踪分支名称,尽管它们的回顾名称并不那么好,但确实是一个很大的改进。

    【讨论】:

      猜你喜欢
      • 2019-10-26
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2021-03-29
      • 2016-01-07
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多