我们知道这是refspec
:
[+]的src:DST
Here你可以看到:
在某些用途中,源ref是可选的;在其他人,结肠和 目的地参考是可选的。
但git如何检测错过的“src”或“:dst”?或者它是如何完成结构的?
答案 0 :(得分:1)
这是给你的练习。请考虑以下refspecs:
+refs/heads/*:refs/remotes/origin/*
refs/heads/master:refs/heads/master
HEAD:branch1
:branch2
branch3
您能确定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 branch3
或git 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
具有分支alpha
,beta
和master
,其中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/master
和git 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>
部分,这基本上就是说使主题分支在远程没有,这将删除它。