我一直在关注配置GitLab与Jenkins持续集成的指南.
作为该过程的一部分,有必要如下设置respec
+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/
*
为什么这有必要没有在帖子中解释,所以我开始在网上寻找解释并查看官方文档以及一些相关的堆栈溢出问题,如此.
尽管如此,我仍然感到困惑 -
什么是refspec?
为什么上面的refspec是必要的 - 它做了什么?
refspec告诉git如何将引用从远程映射到本地repo.
你列出的价值是+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*
; 所以让我们打破它.
你有两种模式,它们之间有空格; 这只是意味着你要给出多个规则.(亲git书指的是两个refspecs;这在技术上可能更正确.但是,如果你需要,你几乎总是能够列出多个refspecs,所以在日常生活中它可能没什么区别.)
那么,第一个模式+refs/heads/*:refs/remotes/origin/*
有三个部分:
+
即使这样做也没有失败地应用规则的方法将以非快进方式移动目标ref.我会回到那个.
之前的部分:
(但是+
如果有的话之后)是"源"模式.这就是说refs/heads/*
,这条规则适用于refs/heads
(意思是分支)下的任何远程引用.
之后的部分:
是"目的地"模式.那是refs/remotes/origin/*
.
因此,如果原点有一个分支master
,表示为refs/heads/master
,这将创建一个origin/master
表示为的远程分支引用refs/remotes/origin/master
.等等任何分支名称(*
).
所以回到那+
......假设起源有
A --- B <--(master)
你获取并应用你得到的refspec
A --- B <--(origin/master)
(如果你应用了典型的跟踪规则并做了一个pull
你也master
指出了B
.)
A --- B <--(origin/master)(master)
现在遥控器上发生了一些事情.有人可能做了一个reset
删除B
,然后承诺C
,然后强迫推.所以遥控器说
A --- C <--(master)
当你拿到,你得到
A --- B \ C
和Git必须决定是否允许移动origin/master
从B
到C
.默认情况下,它不允许这样做,因为它不是快进(它会告诉你它拒绝了该引用的拉动),但因为规则从+
它开始接受它.
A --- B <--(master) \ C <--(origin/master)
(在这种情况下,pull会导致合并提交.)
第二种模式是类似的,但对于merge-requests
refs(我假设它与你的服务器PR的实现有关;我不熟悉它).
有关refspecs的更多信息:https: //git-scm.com/book/en/v2/Git-Internals-The-Refspec