在本地Git存储库中,此文件夹包含克隆之后的HEAD文件:
.git\refs\remotes\origin\
当我从远程跟踪分支创建本地分支时,将在以下位置创建分支:
.git\refs\heads
当我将该本地分支上的更改推送到远程存储库时,将在以下位置创建该分支的新副本:
.git\refs\remotes\origin\
远程跟踪分支在最初被推送到远程存储库时是否首先在上面的文件夹中创建了?
答案 0 :(得分:2)
您不应该关心存储分支的(因为您应该使用"广告"接口,git branch
,git for-each-ref
等等) 。 当问题更有趣时。
远程跟踪分支只是refs/remotes
名称空间中的引用。通常会增加一个级别,特别是遥控器本身的名称,因此对于名为origin
的遥控器,分支将全部落入refs/remotes/origin
。
git clone
命令在本地git配置文件(针对该存储库)中创建remote
配置条目。假设您告诉git clone
使用默认的origin
名称,此配置条目将部分阅读:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
这是名称空间的来源:fetch
配置条目中的remote.origin
行,即来自:
$ git config --get-all remote.origin.fetch
实际的远程跟踪分支创建发生在多个地方。
最明显的是fetch
(或最初的clone
步骤,其中包括fetch
)或git remote update
运行的轻微变化。这些命令询问远程有关其引用的信息。匹配一条或多条fetch
行的内容将根据每个refspec的右侧复制并修改。
这意味着,在git clone
,git fetch origin
或git remote origin update
期间,如果遥控器有refs/heads/foo
(分支foo
),则您自己的本地存储库获得相应的refs/remotes/origin/foo
。如果之前没有,则会创建一个(本地)远程跟踪分支。
(如果您运行git fetch
以阻止其获取分支foo
,则跟踪分支会不创建。例如,如果您运行{ {1}},这次抓取只会带来git fetch origin refs/heads/bar:refs/temp_bar
。不同版本的git目前会或不会创建或更新refs/heads/bar
:1.8.4之前的胜利,但更新的gits所有这些都假设正常的refs/remotes/origin/bar
配置。)
fetch
期间出现不太明显的情况。在这种情况下,当您的本地git成功提供对远程git push
名称空间的引用时,您的本地git也将使用与{{1}相同的refspec映射创建或更新远程跟踪分支。 }}。 因此,使用默认设置,推送refs/heads
以便创建分支git fetch
在远程refs/heads/new
上创建(本地)远程跟踪分支foo
。(我把它放在粗体,因为我认为它是我认为的问题的答案他们问你。)
如果您将origin
添加到refs/remotes/origin/new
或--prune
命令,那么当时它还会删除远程跟踪分支,如果它们现在丢失了在远程 - 他们可以告诉,因为他们从远程获取所有引用。 (请注意,这与git fetch
的{{1}}选项非常不同,后者用于删除遥控器上的分支,la git remote update
或git push
。)