如何克隆包含所有分支的 git 存储库?

Uwe*_*sen 10 git

我有一个服务器,其中包含一个带有多个分支的 git 存储库。我用“git Branch -r”检查了服务器 git,它显示:
origin/HEAD
origin/develop
origin/neatUI
origin/iOS
...以及更多

如果我使用以下命令克隆此存储库:“git clone [path_to_server]/ATS ATS”,我会收到一个仅包含“develop”的存储库。“git分支-a”显示:
*开发
远程/origin/HEAD -> origin/develop
远程/origin/develop

所有其他分支都丢失了。

如果我使用 --mirror 选项克隆存储库,则所有分支都存在,但我无法使用它们。“gitbranch-a”显示:
remotes/origin/HEADremotes
/origin/developremotes
/origin/neatUIremotes
/origin/iOS
...以及其余的

如果我尝试签出分支,git 会告诉我“致命:此操作必须在工作树中运行”

我还尝试了“SourceTree”来克隆存储库,但 SourceTree 仅创建“develop”分支。

有人有想法吗?

tor*_*rek 9

这里有一些独立但相互交织的关键概念。

\n

首先,虽然 Git 有分支名称,但这并不是 Git 的全部(就此而言,术语“分支”是不明确的:另请参阅“分支”到底是什么意思?)。Git 也有标签和 Git 所说的远程跟踪分支名称,这些都属于称为引用的一般类别。

\n
    \n
  • 像这样的分支名称master只是一个名以 开头的引用refs/heads/

    \n
  • \n
  • 远程跟踪分支名称origin/iOS是一个引用,其名以 开头refs/remotes/,后跟远程本身的名称 ( origin) 和另一个斜杠。最后一部分iOS是您的 Git 通常从另一个 Git 复制的内容。

    \n

    (此远程部分几乎是任意字符串。您可以发明自己的远程名称。但是,远程名称后面添加斜杠的事实与您应该小心在您的远程名称中使用斜杠的原因有关。远程名称。)

    \n
  • \n
  • 为了完成这个特定的列表,像这样的标签名称v1.0只是一个名以 开头的引用refs/tags/。还有更多形式的引用(refs/notes/例如 Git\'sgit notes和 GitHub 使用refs/pull/),但分支、标签和远程跟踪分支都是内置的,并且是标准的,最重要的是,高度可见的\xe2\x80\ x94所以你应该了解它们。

    \n
  • \n
\n

当您运行时git branch,Git 会找到所有refs/heads/引用名称并将其显示为refs/heads/剥离状态。当您运行时git branch -r,Git 会找到您的所有refs/remotes/引用并将其显示为refs/remotes/剥离状态。当您运行时git branch -a,Git 会找到两者,并显示第一个refs/heads/已剥离的内容,但显示第二个刚刚refs/剥离的内容。(为什么?谁知道呢!是 Git 变得敏捷了。:-) )

\n

这解释了为什么你看到了你所看到的,而不是发生了什么git clone --mirror,也解释了为什么你可以git checkout iOS突然拥有一个新的refs/heads/iOS;为此,我们还需要两个项目,关于refspecsgit fetch和 一起使用git push),以及关于Git在git checkout.

\n

简而言之:refspec只是一对引用,用冒号分隔,有时其中一部分替换为*。例如,refs/heads/*:refs/remotes/origin/*是一个 refspec。您也可以在 refspec 前面加上前导加号;这设置了--force标志。和git fetchgit push可以使用 refspec(并且两者都有--force自己的标志,这可以有效地将 a 添加+到您在命令行上给出的任何 refspec)。冒号之前的引用是,冒号之后的引用是目标,这很重要,因为和涉及两个Git :你的和其他一些 Git。git fetchgit push

\n

当您使用 时git fetch,源引用是其他 Git 的引用,目标引用是您的引用。当您 时git push,源参考是您的,目标参考是他们的。

\n

使用git clone --mirror告诉你的 Git 设置一个存储库(我将在此处保留未定义)并设置+refs/*:refs/*git fetch. 这会复制来自其他 Git 的所有引用origin,但这意味着您不能拥有自己的分支:您的 Git 现在是他们的精确副本,每次运行时,git fetch您都会用...他们的精确副本替换您拥有的所有内容, 再次。

\n

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

\n

这没有给他们 origin/*留下空间,因为你的不精确副本有它自己的 origin/*。如果你想获得他们的远程跟踪分支,你可以\xe2\x80\x94,但你需要给他们起别的名字!

\n

一旦你有了你的(非镜像)克隆,并且它们whatever成为你的,你就可以使用我上面提到的(和链接的)DWIM操作开始发挥作用,使用你自己的\xe2\x80\x94创建一个新的本地,你从复制的他们的!origin/whatevergit checkout whateverwhateverorigin/whateverwhatever

\n

  • 这是对 git 概念的一个很酷的解释,并回答了他们关于 Y 的问题,但它并没有以任何方式回答关于问题 X 的原始问题:如何获得具有与所有远程分支的当前状态相匹配的本地分支的克隆。 (5认同)

May*_*kar 1

git clone <url>如果您克隆的所有分支都在工作树中,请放心。当你想签入其他分支时,你只需要删除 origin/ 即可。例如,如果您想结账 iOS,请执行以下操作git checkout iOS

git branch -r显示存储库上的所有远程分支

git branch -a显示远程和本地分支(如果您在本地存储库中创建了任何分支)