refspec 告诉 git 如何将引用从远程映射到本地存储库。
您列出的值是+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
fromB
到的移动C
。默认情况下,它不允许这样做,因为它不是快进(它会告诉你它拒绝了对该 ref 的拉取),但因为规则以它开头,+
它会接受它。
A --- B <--(master)
\
C <--(origin/master)
(在这种情况下,拉取将导致合并提交。)
第二种模式类似,但对于merge-requests
refs (我认为这与您的服务器的 PR 实现有关;我不熟悉它)。
有关参考规范的更多信息: https ://git-scm.com/book/en/v2/Git-Internals-The-Refspec