:refs/remotes/origin/"-6ren"> :refs/remotes/origin/"-Jenkins Git 插件根据我的引用规范在控制台输出中生成了以下命令 下面两个命令有什么区别?他们的输出看起来没什么不同。我在下面给出了他们的输出: 命令 1: git fetch --no-ta-6ren">
gpt4 book ai didi

混帐: "+refs/heads/:refs/remotes/origin/"

转载 作者:行者123 更新时间:2023-12-04 16:09:42 29 4
gpt4 key购买 nike

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

最佳答案

用冒号分隔两个引用的语法,整个内容可选地以加号为前缀,是 refspec。 Refspecs 也可以省略冒号并且只包含一个引用,在这种情况下加号可能(取决于这个退化的 refspec 的使用)没有功能。有关引用规范的更多信息,请参阅,例如,What is the difference between these `git fetch` syntaxes?

不过,将问题本身倒序来看:

  • 第 3 项完全错误。名称refs/heads/qa 分支名称;它只是完整地拼写出来,因为它应该在 refspec 中。它根本不是“工作副本”:它只是一个名称。 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),并且您总是获取所有名称,这实际上是完全合理的行为:用新的、正确的信息覆盖旧的、陈旧的信息。当您从多个 Remote 获取和/或当您零碎地获取项目时,它会崩溃。远程跟踪分支名称,尽管回想起来并不那么好,但确实是一个很大的改进。

关于混帐: "+refs/heads/<branch>:refs/remotes/origin/<branch>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44905790/

29 4 0