我一直在遵循本指南来配置GitLab与Jenkins的持续集成。
作为该过程的一部分,有必要将respec设置如下
+refs/heads/*:refs/remotes/origin/* +refs/merge- requests/*/head:refs/remotes/origin/merge-requests/*
+refs/heads/*:refs/remotes/origin/* +refs/merge- requests/*/head:refs/remotes/origin/merge-requests/
为什么没有必要在这篇文章中进行解释,所以我开始在网上寻找解释,并看了一下官方文档以及一些与此相关的堆栈溢出问题。
尽管如此,我仍然感到困惑-
refspec到底是什么?
为何上述refspec是必要的-它有什么作用?
refspec告诉git如何将引用从远程映射到本地仓库。
您列出的值是+refs/heads/*:refs/remotes/origin/* +refs/merge- requests/*/head:refs/remotes/origin/merge-requests/*; 所以让我们分解一下。
您有两个模式,它们之间有一个间隔;这只是意味着您要给出多个规则。(专业版git书将其称为两个refspecs;从技术上讲,这可能更正确。但是,您几乎总是可以列出多个refspecs,因此在日常生活中,这可能几乎没有什么区别。)
那么,第一种模式+refs/heads/*:refs/remotes/origin/*包括三个部分:
+refs/heads/*:refs/remotes/origin/*
+
:
refs/heads/*
refs/heads
refs/remotes/origin/*
因此,如果原点有一个分支master表示为refs/heads/master,这将创建一个远程分支引用origin/master表示为refs/remotes/origin/master。对于任何分支名称(*)依此类推。
master
refs/heads/master
origin/master
refs/remotes/origin/master
*
回到那个+…假设起源
A --- B <--(master)
您获取并应用该refspec即可
A --- B <--(origin/master)
(如果您应用了典型的跟踪规则并且做了,pull您也已经master指出了B。)
pull
B
A --- B <--(origin/master)(master)
现在,某些事情发生在遥控器上。也许有人做了一个reset删除B,然后提交C,然后强行推动的操作。所以遥控器说
reset
C
A --- C <--(master)
当您获取时,您会得到
A --- B \ C
和git必须决定是否允许origin/master从B到的移动C。默认情况下,这是不允许的,因为它不是一个快进(它会告诉您它拒绝了该引用的请求),但是因为规则以+它开头而将接受它。
A --- B <--(master) \ C <--(origin/master)
(在这种情况下,拉动将导致合并提交。)
第二种模式是相似的,但是对于merge-requests引用(我认为与您的服务器对PR的实现有关;我不熟悉)。
merge-requests
有关refspec的更多信息:https : //git-scm.com/book/en/v2/Git-Internals-The-Refspec