Git: "+refs/heads/<branch>:refs/remotes/origin/<branch>"

3
Jenkins Git插件根据我的Ref Spec在控制台输出中生成了以下命令:
  1. What's the difference between below 2 commands? Their output looks little different. I have given their output below:

    Command 1:

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

    Output:

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

    Command 2:

    git fetch --no-tags --progress repo.git refs/heads/qa --depth=1

    Output:

    From <repo>
     * branch            qa         -> FETCH_HEAD
    
  2. What does FETCH_HEAD here mean?

  3. I believe refs/heads/qa is local working copy of 'qa' branch and refs/remotes/origin/qa is remote 'qa' branch. But, what does this convention imply?

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

1个回答

2
用冒号分隔的两个引用语法,整个内容可选择在前面加上一个加号作为标识符,这被称为“refspec”。"refspecs”也可以省略冒号并只包含一个引用��此时加号可能没有功能(取决于此退化refspec的使用)。有关更多信息,请参见这里
反过来看问题:
1. 项目3是完全错误的。名称refs/heads/qa就是分支名称,应该以全称表示。它根本不是“工作副本”,它只是一个名称。Git使用名称-引用将人类可读字符串(如“master”和“qa”)映射到Git内部哈希ID。 “引用”是分支、标签、远程跟踪分支和其他名称的概括。
类似地,refs/remotes/origin/qa是完全拼写出来的引用,通常缩短为origin/qa的远程跟踪分支。与名为refs/heads/qa的分支一样,Git使用此名称将人类可读字符串origin/qa映射到哈希ID。
2. 名称FETCH_HEAD是指.git/FETCH_HEAD目录中的文件。当您使用git fetch的非常古老的形式(在远程跟踪分支被发明之前)时,Git必须将所有提取的名称和ID值存储在某处。这个“某处”就是该文件。然后,其他Git命令可以获取每个名称和ID对。
在2007年左右的遥远时代之前,这是您唯一可以使用git fetch的方法。远程跟踪分支名称之所以被发明,是因为很好地记住这些名称更长时间——除非您使用-a,否则每个新的git fetch都会覆盖旧数据,并且使用起来更容易。
3. 有关项目1(区别)的内容,请参见其他答案。

1如果你只从一个远程源(例如,从origin)获取数据,并且总是获取所有名称,那么这种行为实际上是完全合理的:用新的、正确的信息覆盖旧的、过时的信息。但当你从多个远程源获取数据和/或逐个获取项目时,这种行为就会崩溃。尽管远程跟踪分支名称在回顾中并不是很好,但它们确实是一项相当不错的改进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接