乐闻世界logo
搜索文章和话题

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

9 个月前提问
5 个月前修改
浏览次数209

6个答案

1
2
3
4
5
6

首先,当您克隆一个Git仓库时,默认情况下,git clone 命令将克隆远程仓库中的所有分支,但是在本地只会创建一个跟踪远程仓库origin/master分支的分支,即master分支。这意味着您的本地仓库中已经包含了远程仓库中所有分支的信息,但是为了切换到这些远程分支,您需要在本地创建相对应的跟踪分支。

如果您需要在本地显式地创建并切换到所有远程分支的跟踪分支,可以按照以下步骤操作:

  1. 首先克隆远程仓库:

    shell
    git clone [remote-url]

    这样操作会创建所有远程分支的引用,在.git/refs/remotes/origin/目录下。

  2. 接下来,您可以使用git branch -a 查看所有分支,包括远程分支。

  3. 然后,对于每个远程分支,您可以使用以下命令创建本地分支并建立跟踪关系:

    shell
    git checkout -b [branch-name] origin/[branch-name]

    这个命令会创建一个新的本地分支[branch-name],并设置它跟踪对应的远程分支。

例如,如果远程仓库有一个名为feature的分支,我想要在本地创建并切换到这个分支,我将会执行:

shell
git checkout -b feature origin/feature

如果您希望自动化这个过程,可以使用下面的脚本在克隆后创建并切换到所有远程分支的本地跟踪分支:

shell
# 克隆仓库 git clone [remote-url] # 进入仓库目录 cd [repository-name] # 遍历所有远程分支并创建本地跟踪分支 for branch in `git branch -r | grep -v '\->'`; do if [ "origin/HEAD" != "$branch" ]; then git checkout -b `echo $branch | sed 's/origin\///'` $branch fi done # 切换回主分支 git checkout master

这段脚本会克隆远程仓库,并为除了HEAD以外的所有远程分支创建本地分支,然后切换回主分支。注意,您需要替换[remote-url][repository-name]为实际的远程仓库URL和仓库名称。

2024年6月29日 12:07 回复

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

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

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

shell
$ git branch * master

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

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

要快速浏览上游分支,请直接查看:

shell
$ git checkout origin/experimental

要处理该分支,请创建一个本地跟踪分支,这是通过以下方式自动完成的:

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

这里,“新分支”仅意味着从索引中获取分支并在本地为您创建。正如_上_一行告诉您的,正在设置分支来跟踪远程分支,这通常意味着 origin/branch_name 分支。

您的本地分支机构现在应该显示:

shell
$ git branch * experimental master

您可以使用以下命令跟踪多个远程存储库git remote

shell
$ 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看看发生了什么:

shell
$ gitk --all &
2024年6月29日 12:07 回复

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

shell
git pull --all

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

2024年6月29日 12:07 回复

这个Bash脚本帮助了我:

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

它将为所有远程分支创建跟踪分支,但 master 除外(您可能从原始克隆命令中获得)。我想你可能还需要做一个

shell
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

2024年6月29日 12:07 回复

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

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

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

2024年6月29日 12:07 回复

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

shell
git checkout somebranch

Git 会自动做正确的事情:

shell
$ 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 手册页:

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

shell
$ git checkout -b <branch> --track <remote>/<branch>
2024年6月29日 12:07 回复

你的答案