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