您将如何读取被复制以创建当前签出的分支的分支的名称?
当前分支名称为:
git symbolic-ref HEAD
假设当前分支是从另一个分支(有时称为另一个分支的克隆)的副本开始的,那么如何找到该分支的名称?
答案 0 :(得分:0)
假设您没有更改任何默认设置,并且没有做任何奇怪的事情, other Git中的分支名称通常与相同您自己的Git中分支的名称。也就是说,您的 master
与其 master
(您称为origin/master
)相关。
但是,不能保证:如果创建一个名为xyzzy
的新分支而不检查它们是否也有一个名为xyzzy
的分支,则您的xyzzy
可能与其{ {1}},如果您有xyzzy
也没有。
您不完全克隆分支; 您克隆整个存储库。
您刚刚克隆的存储库传递给origin/xyzzy
的URL存储在您选择的 remote 名称下。如果您没有选择,Git将使用其内置的默认值git clone
,因此,您从其克隆的URL将存储在origin
下:
remote.origin.url
您可以限制克隆过程检查的分支名称。但是请注意,这些分支名称是在某些 other Git(在您指定的URL)上找到的:它们不是您自己的分支名称。默认是使用 all 其他Git列出的分支名称。也就是说,您的Git通过URL连接到其他Git,并让另一个Git列出了它的所有分支,所有标签以及它可以列出的所有其他名称:
$ git config --get remote.origin.url
<url>
如果将此方法应用于$ git ls-remote <url>
,则输出会很长:
git://github.com/git/git
这些都是Git愿意导出的所有名称。您的Git会使用这些名称,并修改以$ git ls-remote git://github.com/git/git
b7bd9486b055c3f967a870311e704e3bb0654e4f HEAD
53f9a3e157dbbc901a02ac2c73346d375e24978c refs/heads/maint
b7bd9486b055c3f967a870311e704e3bb0654e4f refs/heads/master
5c9ce644c390ec4ef3ba4adc94e7f4af17ade36b refs/heads/next
1aaaa8cf15ba4eb62d485c5c8b64d6a75b9e7c3f refs/heads/pu
f59de5ad04b18866024fb298ddb276cb51d91673 refs/heads/todo
[lots of text snipped]
8d091e9ed473c372a5b89d1258d1c3ad01daa04c refs/tags/v2.9.4
d61226c1118f749280c050555d83560ca0f3bf71 refs/tags/v2.9.4^{}
dcba104ffdcf2f27bc5058d8321e7a6c2fe8f27e refs/tags/v2.9.5
4d4165b80d6b91a255e2847583bd4df98b5d54e1 refs/tags/v2.9.5^{}
开头的分支名称,以创建您的远程跟踪名称,将refs/heads/
替换为refs/heads/
(假设您使用的是默认的远程名称refs/remotes/origin/
)。
此时,您的克隆具有:
origin
依此类推,并根据您要求Git从其Git中保留的内容,加上所有标签(直接复制为refs/remotes/origin/maint
refs/remotes/origin/master
仍为refs/tags/v2.12.0
)。
所有下载完成后,refs/tags/v2.12.0
所做的最后一件事是指示您自己的Git签出某些特定的提交(通常通过分支名称)。您可以选择您的Git应该使用的名称,但如果不使用,则Git会使用其Git的指示来选择一个名称,通常为git clone
。您的Git尚未拥有这样的分支,但是您的Git 拥有具有远程跟踪名称 master
({ {1}})。因此,您的Git现在使用您Git刚保存的origin/master
的相同提交哈希ID,创建自己的分支refs/remotes/origin/master
-master
作为其全名。在上面的示例中,为refs/heads/master
。
Git将此称为“ DWIM”或“我的意思”:您要求Git签出一些现有的分支名称,但还没有该分支名称。因此,您的Git会探查您的远程跟踪名称,以查看是否存在匹配的名称。这种匹配必须完全匹配:如果是这样,则Git会创建您的名称,并指向与您的远程跟踪名称相同的提交。
但是,如果您使用origin/master
或b7bd9486b055c3f967a870311e704e3bb0654e4f
创建一个名为 git checkout -b name
的新分支,则您的Git不必查找远程跟踪名称。无论是否存在类似的远程跟踪名称,您的Git都立即创建该名称,指向当前提交。
所有这些精美的重命名都可以通过 fetch refspecs 由您自己控制。如果您使用标准远程名称git branch name
进行了标准克隆,然后运行:
name
您将获得一行输出读数:
origin
这是一个 refspec ,它控制$ git config --get remote.origin.fetch
的默认行为:您的Git会在+refs/heads/*:refs/remotes/origin/*
处调用另一个Git,并获得与我们看到的名称相同的列表与上面的git fetch origin
匹配,并将分支名称匹配到这对的remote.origin.url
部分。然后它将把这些名称中的每一个重写到右侧的git ls-remote
中,refs/heads/*
部分将替换为之前匹配的内容。这就是他们的refs/remotes/origin/*
成为您的*
的机制,依此类推。
某些克隆选项(尤其是master
)会更改此默认refspec。您也可以手动更换它。这样做几乎没有充分的理由-默认值通常是正确的。如果要这样做,请阅读refspec。