Jenkins Git插件根据我的参考规范
在控制台输出中生成了以下命令以下2个命令有什么区别?他们的输出看起来差别不大我在下面给出了他们的输出:
命令1:
git fetch --no-tags --progress repo.git +refs/heads/qa:refs/remotes/origin/qa --depth=1
输出:
From <repo>
* [new branch] qa -> origin/qa
命令2:
git fetch --no-tags --progress repo.git refs/heads/qa --depth=1
输出:
From <repo>
* branch qa -> FETCH_HEAD
FETCH_HEAD在这里是什么意思?
我相信refs/heads/qa
是'qa'分支的本地工作副本,refs/remotes/origin/qa
是远程'qa'分支。但是,这个惯例意味着什么?
+参/头/ QA:参/遥控器/来源/ QA
答案 0 :(得分:2)
带有两个以冒号分隔的引用的语法,其中整个事物可选地以加号为前缀,是 refspec 。 Refspecs也可以省略冒号并且只包含一个引用,在这种情况下,加号可能(取决于使用这个退化refspec)是无功能的。有关refspecs的更多信息,请参阅,例如What is the difference between these `git fetch` syntaxes?
以相反的顺序自己提问:
第3项是完全错误的。名称refs/heads/qa
是分支名称;它完全拼写出来,因为它应该在refspec中。它不是&#34;工作副本&#34;根本就是:它只是一个名称。 Git使用名称引用来从人类可读的字符串(如master
和qa
)映射到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值。那个&#34;某个地方&#34;是这个文件。然后,其他Git命令可以删除每个名称和ID对。
回到昏暗时间,大约在2007年之前,这是你使用git fetch
的唯一方法。远程跟踪分支名称的发明是因为让你自己的Git记住更长时间的这些名称是很好的 - 每个新的git fetch
都会覆盖旧数据 1 ,除非你使用-a
- 以及更容易使用的方式。
对于第1项(区别的是什么),请参阅另一个答案。
1 如果您只从一个遥控器(例如,从origin
),和获取,您总是获取所有名称,这实际上是完全合理的行为:使用新的正确信息覆盖旧的陈旧信息。当您从多个遥控器获取时和/或当您逐步获取项目时,它会崩溃。远程跟踪分支机构名称,尽管它们的名称并不那么精彩,但实际上是一种很大的改进。