如何在 Git 中克隆所有远程分支?

我有一个master和一个development分支,都被推送到GitHub 。我已经clone d, pull ed 和fetch ed,但是除了master分支以外,我仍然无法获得任何东西。

我敢肯定我遗漏了一些明显的东西,但是我已经阅读了手册,一点也没有感到高兴。

答案

首先,克隆一个远程Git存储库并cd到其中:

$ git clone git://example.com/myproject
$ cd myproject

接下来,查看存储库中的本地分支:

$ git branch
* master

但是您的存储库中还隐藏着其他分支!您可以使用-a标志查看它们:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

如果您只想快速浏览上游分支机构,则可以直接查看:

$ git checkout origin/experimental

但是,如果要在该分支上工作,则需要创建一个本地跟踪分支,该分支可以通过以下方式自动完成:

$ git checkout experimental

你会看到

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

最后一行引发了一些人:“新分支”- 是吗?这实际上意味着分支是从索引中提取的,并为您本地创建。 一行实际上更具信息性,因为它告诉您正在建立分支以跟踪远程分支,这通常意味着 origin / branch_name 分支

现在,如果您查看本地分支机构,将看到以下内容:

$ git branch
* experimental
  master

实际上,您可以使用git remote跟踪多个远程存储库。

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

此时,事情变得非常疯狂,因此运行gitk看看发生了什么:

$ gitk --all &

如果您要一次获取许多远程分支,请执行以下操作:

$ git pull --all

现在,您可以根据需要签出任何分支,而无需访问远程存储库。

这个Bash脚本帮助我:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

它将为所有远程分支(主服务器除外)创建跟踪分支(您可能是从原始克隆命令获得的)。我认为您可能仍需要做一个

git fetch --all
git pull --all

为了确定。

一班轮git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
像往常一样:我们知道,在复制 rm -rf Universe 之前先对您的设置进行测试

一线积分归功于用户 CFI

使用--mirror选项似乎可以正确复制remote跟踪分支。但是,它会将存储库设置为裸存储库,因此之后必须将其转换回普通存储库。

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

参考: Git 常见问题解答:如何克隆具有所有远程跟踪分支的存储库?

您可以轻松切换到分支,而无需使用奇特的 “git checkout -b somebranch origin / somebranch” 语法。您可以这样做:

git checkout somebranch

Git 会自动做正确的事情:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git 将检查在一个远程站点中是否存在同名分支,如果存在,它将以与您明确指定它是远程分支相同的方式进行跟踪。从 Git 1.8.2.1 的 git-checkout 手册页中:

如果未找到 ,但确实在一个具有匹配名称的远程站点(称为 )中存在跟踪分支,则将其等同于

$ git checkout -b <branch> --track <remote>/<branch>

关于,

$ git checkout -b 实验来源 / 实验

使用

$ git checkout -t origin/experimental

或更冗长但更容易记住

$ git checkout --track origin/experimental

在跟踪远程存储库方面可能会更好。

您正在执行的访存应获取所有远程分支,但不会为它们创建本地分支。如果使用 gitk,则应该看到远程分支描述为 “remotes / origin / dev” 或类似内容。

要基于远程分支创建本地分支,请执行以下操作:

git checkout -b dev refs/remotes/origin/dev

应该返回如下内容:

Branch dev set up to track remote branch refs/remotes/origin/dev.
Switched to a new branch "dev"

现在,当您在 dev 分支上时,“git pull” 将把您的本地 dev 更新到与远程 dev 分支相同的位置。请注意,它将获取所有分支,但仅将您所在的分支拉到树的顶部。

当您执行 “git clone git:// location” 时,将提取所有分支和标记。

为了在特定的远程分支之上工作,假设它是源远程:

git checkout -b branch origin/branchname

使用别名。虽然没有任何本地 Git 一线客机,但您可以将自己定义为

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

然后将其用作

git clone-branches

为什么只看到 “主人”

git clone下载所有远程远程分支,但即使文件位于您的新存储库中,也仍然将它们视为 “远程”。唯一的例外是,克隆过程会从称为 “master” 的远程分支创建一个名为 “master” 的本地分支。默认情况下, git branch仅显示本地分支,这就是为什么您只看到 “master” 的原因。

git branch -a显示所有分支, 包括远程分支


如何获得当地分支机构

如果您确实想在分支上工作,则可能需要它的 “本地” 版本。要简单地从远程分支创建本地分支(无需检出它们,从而不更改工作目录的内容) ,可以这样进行:

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

在此示例中, branchone是您基于origin/branchone创建的本地分支的名称;如果您想使用不同的名称创建本地分支,则可以执行以下操作:

git branch localbranchname origin/branchone

创建本地分支后,您可以使用git branch查看它(请记住,您不需要-a即可查看本地分支)。