Git如何检测错过refspec的“src”或“:dst”

时间:2016-04-21 07:42:34

标签: git

我们知道这是refspec

的结构

[+]的src:DST

Here你可以看到:

  

在某些用途中,源ref是可选的;在其他人,结肠和   目的地参考是可选的。

但git如何检测错过的“src”或“:dst”?或者它是如何完成结构的?

2 个答案:

答案 0 :(得分:1)

这是给你的练习。请考虑以下refspecs:

  1. +refs/heads/*:refs/remotes/origin/*
  2. refs/heads/master:refs/heads/master
  3. HEAD:branch1
  4. :branch2
  5. branch3
  6. 您能确定1,2和3的哪一部分是src:dst部分吗? (这应该非常很容易。)

    #4:src:dst中的一个丢失了。缺少哪一个,哪一个存在?

    #5:src:dst中的一个再次丢失。缺少哪一个,哪一个存在?

    这些也应该很容易。

    完成练习后......

    现在您可以轻松识别哪个部件,我们可以讨论如何使用这些部件。请注意,在<src>:<dst>中,git fetch部分或git push部分缺少的部分refspecs-refspecs的处理方式不同。

    (就此而言,完整refspecs的处理方式也是如此,除此之外它更容易:使用fetch远程部分位于左侧,{{1 <src>部分引用您自己的存储库中的引用。使用:<dst>,左侧或push侧是您的引用,右侧或<src>侧是他们的。)

    对于:<dst>,如果缺少git fetch部分,则部分refspec无意义(是错误)。只能省略<src>部分。省略:<dst>部分告诉:<dst>跳过更新,它通常会记住远程的引用。也就是说,像git fetch这样的完整refspec意味着git应该从远程读取refs/heads/master:refs/remotes/origin/master,然后在refs/heads/master处将它看到的内容写入您自己的副本中。如果没有refs/remotes/origin/master部分,git可能不会在任何地方写这个。 1

    :<dst>命令的行为完全不同。如git push中一样省略<src>部分,向远程发送删除请求。省略git push origin :branch2部分会使:<dst>选择默认git push。确切的选择取决于您的配置(以及您的git版本,因为旧版本中不存在某些较新的配置控件),但“默认默认值”是重复:<dst>部分,因此{{ 1}}转换为<src>

    请注意,如果您使用短{(git push origin branch3git push origin branch3:branch3)的refs/heads/refs/tags/这样的名称,git会尝试自动找出这是一个分支或标记你的分支和标签集。如果您有一个名为branch3的标签而且没有名为v3.7的分支,git会发现v3.7表示git push origin v3.7

    1 当然,不写任何地方都没用,但是git push origin refs/tags/v3.7:refs/tags/v3.7 总是一切< / em>到特殊文件git fetch。从git 1.8.4开始,FETCH_HEAD也会查询配置文件中的所有git fetch refspec,因此fetch =通常会得到更新。为refs/remotes/origin/master行选择不寻常的refspecs,或者省略或删除fetch =行可以说明这一点,但大多数情况下,使用git 1.8.4或更新版本,这种特殊的区别就会消失。

    例如,假设远程origin具有分支alphabetamaster,其中alpha具有活动开发“alpha”状态代码(“我们甚至不一定相信这是有效的,但它有最新的想法“),beta提出了 - { - 1}}”我们相信它有效,但它仍然没有经过良好测试“代码,并且master具有用户通常应运行的经过测试/支持的版本。同时,您的master行设置为默认值remote.origin.fetch

    您决定要抓取最新的+refs/heads/*:refs/remotes/origin/*,以便运行alpha。 Git会将原点git fetch origin alpha的SHA-1写入refs/heads/alpha,但是在git 1.8.4或更新版本中,将此SHA-1写入{{1} }。 Git不会更新FETCH_HEAD也不会更新refs/remotes/origin/alpha ,即使这些实际上是相同的新SHA-1

    然后,在您输入命令之前,您还要确定要获取测试版,因此您实际输入refs/remotes/origin/beta。 Git会将原始refs/remotes/origin/mastergit fetch origin alpha beta的两个SHA-1写入refs/heads/alpha及其相应的远程跟踪分支,但不会更新refs/heads/beta

    如果两个更新的分支具有不同的SHA-1,这两个分支都需要引入新对象,则实际输入的FETCH_HEAD将带来比您要输入的refs/remotes/origin/master更多的对象,因为它必须带来使被带来的fetch有效所需的对象。

答案 1 :(得分:0)

在这里阅读:

https://git-scm.com/book/en/v2/Git-Internals-The-Refspec#Deleting-References

  

您还可以使用refspec通过运行以下内容来删除远程服务器中的引用:

$ git push origin :topic
     

因为refspec是<src>:<dst>,所以离开<src>部分,这基本上就是说使主题分支在远程没有,这将删除它。