gpt4 book ai didi

Git - 什么是 "Refspec"

转载 作者:IT王子 更新时间:2023-10-29 00:55:43 26 4
gpt4 key购买 nike

我一直在关注 this guide关于配置 GitLab 与 Jenkins 的持续集成。

作为流程的一部分,需要按如下方式设置 refspec:+refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*

帖子中没有解释为什么这是必要的,所以我开始在网上寻找解释并查看了 official documentation以及一些相关的 StackOverflow 问题 like this one .

尽管如此,我还是一头雾水:

refspec 到底是什么? 为什么需要上述 refspec - 它有什么作用?

最佳答案

refspec 告诉 git 如何将引用从远程仓库映射到本地仓库。

您列出的值是 +refs/heads/*:refs/remotes/origin/* +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/*;所以让我们分解一下。

你有两个模式,它们之间有一个空格;这只是意味着你给出了多个规则。 (pro git 书将此称为两个 refspecs;这在技术上可能更正确。但是,如果需要,您几乎总是能够列出多个 refspecs,因此在日常生活中它可能没什么区别。)

然后,第一个模式是 +refs/heads/*:refs/remotes/origin/*,它包含三个部分:

  1. + 意味着应用规则而不会失败,即使这样做会以非快进方式移动目标引用。我会回到那个。
  2. : 之前的部分(如果有,则在+ 之后)是“源”模式。那是 refs/heads/*,这意味着此规则适用于 refs/heads(意思是分支)下的任何远程引用。
  3. : 之后的部分是“目标”模式。那是 refs/remotes/origin/*

所以如果 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)

现在 Remote 上发生了一些事情。有人可能做了一个 reset 删除 B,然后提交 C,然后强制推送。所以 Remote 说

A --- C <--(master)

当你获取时,你得到

A --- B
\
C

并且 git 必须决定是否允许将 origin/masterB 移动到 C。默认情况下它不会允许这样做,因为它不是快进(它会告诉你它拒绝了那个 ref 的 pull ),但是因为规则以 + 开头它会接受它。

A --- B <--(master)
\
C <--(origin/master)

(在这种情况下, pull 将导致 merge 提交。)

第二种模式类似,但用于merge-requests refs(我假设这与您的服务器对 PR 的实现有关;我对此并不熟悉)。

关于引用规范的更多信息:https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

关于Git - 什么是 "Refspec",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44333437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com