2017-06-13 119 views
1

我有一个服务器包含一个Git仓库与几个分支。 我查了与 “混帐分支-r” 服务器Git和它显示:
出身/ HEAD
产地/开发
产地/ neatUI
产地/ iOS的
......以及一些更如何克隆所有分支的git存储库?

如果我克隆这个存储库: “git clone [path_to_server]/ATS ATS” 我收到一个只包含“develop”的存储库。 “混帐分支-a” 显示:
*开发
遥控器/产地/ HEAD - >原产地/开发
遥控器/原产地/开发

所有其他分支丢失。

如果我使用--mirror选项克隆存储库,所有分支都存在,但我无法使用它们。 “混帐分支-a” 显示:
遥控器/产地/ HEAD
遥控器/原产地/开发
遥控器/产地/ neatUI
遥控器/产地/ iOS的
......其余

如果我尝试结帐分支git告诉我“致命的:这个操作必须在工作树上运行”

我也试过“SourceTree”来复制repoistory,但SourceTree也只创建了“develop”分支。

任何人有想法?

+0

镜像克隆是克隆裸露,你不能在它检查的分支。 –

+0

您有一个服务器存储库。你在该回购中运行'git branch -r'。运行'git branch -r'不会列出该回购中的分支。它列出了远程分支。 IE浏览器。 '''''''iOS'和'neatUI'都是您的服务器存储库克隆的其他仓库中的所有分支。要列出服务器仓库中的分支,你应该运行'git branch'而不用'-r'标志。 – Alderath

+0

git分支只显示“开发”。看起来你在正确的轨道上! :) 如何添加其他分支? –

回答

0

Alderath在他上面的评论中给出了重要提示。
再次感谢您!

2

如果您使用git clone <url>进行克隆,请放心,所有分支都在您的工作树中。你只需要剥离原产地/当你想签入其他分支。例如,如果要检出的iOS,做git checkout iOS

git branch -r显示了库中的所有远程分支机构

git branch -a远程显示以及地方分支机构(如果你创建的任何在您的本地回购)

+0

如果我只是克隆回购(没有 - 镜像),没有iOS分支。 “git checkout iOS”产生“error:pathspec”iOS与git.r已知的任何文件不匹配)“ –

+0

你如何切换你的分支? –

+0

我如何确保所有分支都在那里?正如我之前告诉“git branch -a”只显示“开发”... –

1

这里有几个独立但交织在一起的关键概念。

首先是,虽然Git有分支名称,那是不是所有的Git有(为此事,术语分支是模糊的:又见What exactly do we mean by "branch"?)。 Git也有标签以及Git所称的远程跟踪分支名称,这些都属于一个通用类别,称为,参考文献

  • master一个分支的名字仅仅是一个参考,其名与refs/heads/开始。

  • origin/iOS等的远程跟踪分支名是参考其名与refs/remotes/开始,接着由远程本身(origin)和另一斜杠的名称。该最后部分,iOS,是你的Git通常副本从另一个Git

    (这样做的远程部分是一个几乎任意字符串。你可以发明自己的远程名称。但是,遥控器的名称获取以后添加的斜线是依赖于你应该是理由的事实小心在远程名称中使用斜线。)

  • 要完成这个特殊的名单,像v1.0标签名称是一个简单的引用,其名与refs/tags/开始。还有更多的引用形式(refs/notes/用于Git的git notes,而GitHub用例子为refs/pull/),但分支,标签和远程跟踪分支都内置,标准的,最重要的是,高度可见 - 所以你应该知道关于他们。

当您运行git branch,Git会找到你所有的refs/heads/参考名称,并显示它们与refs/heads/剥离。当您运行git branch -r时,Git会查找您所有的refs/remotes/引用,并将它们与refs/remotes/一起剥离。当你运行git branch -a时,Git发现了这两个,并且显示第一个被剥离的refs/heads/,但是显示第二个被剥离了refs/。 (?!为什么谁知道这是Git的是gitty :-))。

这就解释了为什么你看到你所看到的,但不能与git clone --mirror会发生什么,也不知道为什么你可以git checkout iOS,突然有一个新的refs/heads/iOS;并且为此我们需要两个以上的项目,大约refspecs(与git fetchgit push一起使用)和约what Git calls DWIM, or Do What I Mean, in git checkout

为了保持这个简短:a 参考只是一对引用,用冒号分隔,有时用*替换一部分。例如,refs/heads/*:refs/remotes/origin/*是一个refspec。你也可以在前面加一个前导加号的前缀refspec;这将设置--force标志。 git fetchgit push与refspecs一起工作(并且都有--force他们自己的标志,它有效地将+添加到您在命令行上给出的任何refspecs)。冒号前的参考是和参考冒号后是目的地,这很重要,因为有2个控释片参与git fetchgit push:你的,和其他一些Git的。

当你git fetch,源引用其他Git的引用和目标的人是你。当你git push,来源参考是你的,而目的地是他们的。

使用git clone --mirror告诉你的Git建立一个库(我将离开这里未定义),并设立+refs/*:refs/*为的Refspec为git fetch。这复制所有参考从其他Git在origin,但它意味着你不能拥有自己的分支机构:你的Git现在是他们的一个确切的副本,并且每次运行git fetch时,您的取代您所拥有的一切。他们的确切副本,再次。

大多数git clone操作的要点是得到一个不精确“他们的Git”的副本。这里的基本想法是,你希望所有的他们分支名称成为远程跟踪分支名称。他们的master成为您的origin/master;他们的iOS成为您的origin/iOS

这没有留下余地他们origin/*,因为你的不精确的副本具有自己的origin/*。如果你想获得他们的远程追踪分支,你可以 - 但你需要给他们一些其他的名字!

一旦你有你的(无反光镜)克隆,和他们whatever成为你origin/whatever,可以git checkout whatever和DWIM动作我提到(和链接)以上进场时,创建新的本地whatever使用自己的origin/whatever哪位你从他们的whatever复制!