如何克隆所有远程分支?

问题描述:

我的 master 和 development 分支在 GitHub 上被远程跟踪。如何克隆这两个分支?

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

解决方案1:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

首先,将远程 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 &

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

有人如何自动创建所有远程分支,例如原始/实验的实验性分支?

Cristian:我过去总是为每个分支 'origin/foo' 创建一个分支 'foo',但这导致了两个问题:(1)我最终得到了很多非常陈旧的跟踪分支,这些分支在相应的远程分支后面有很多提交, 和 (2) 在旧版本的 git 中,运行“git push”会尝试将我所有的本地分支推送到远程,即使这些分支已经过时。所以现在我只为我正在积极开发的东西保留本地分支,如果我需要有关它们的信息,则直接访问 origin/* 分支。 (也就是说,您可以使用 shell 脚本来解析 'git branch -a'。)

“git fetch ” 为您在本地关闭分支。

很好的答案,但有点错过了这个问题。我正在寻找一个单线来检查所有远程分支机构。

问题是关于克隆所有远程分支,而不是检查它们。而且,正如我上面提到的,您真的不想创建任何不必要的本地跟踪分支,因为当它们变得非常陈旧时,它们会引起头痛。

解决方案2:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

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

git pull --all

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

注意:这不会创建任何未签出分支的工作副本,这就是问题所在。为此,请参阅

大鱼的回答

戴夫的回答

如果我执行 git clone,我在本地拥有 master 分支和 10 个“远程”分支。因此,Gabe 的这个回答非常有帮助并回答了这个问题。

这仅获取已在本地添加的远程分支,而不是任何远程分支

第一个命令是多余的。只需 git pull --all 会做同样的事情 - 它不会提取两次。并且 infosec812 是正确的,这无论如何都不能回答这个问题。我想知道这是怎么得到这么多赞成票的。

这根本没有帮助,不会拉除现有的任何远程分支。

这不是第一次因为它没有回答问题而完全错误的答案得到数百人的支持,这些人要么不理解问题和/或答案,要么被谷歌登陆以搜索其他内容作为原始 OP问题和这样的“答案”意外地回答了他们的问题。不幸的是,没有有效的答案标志不回答问题,唯一的方法是downvoting,这在某些情况下显然不起作用,所以这种噪音将永远存在:(

解决方案3:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

这个 Bash 脚本帮助了我:

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

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

git fetch --all
git pull --all

为了确定。

一个班轮: git branch -a | grep -v 头 | perl -ne 'chomp($); s|^*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/KaTeX parse error: Undefined control sequence: \n at position 2: 2\̲n̲)} else {d{$}=1} ’ | csh -xfs 像往常一样:在复制 rm -rf Universe 之前在您的设置中进行测试,正如我们所知

这非常接近于成为一个完美的解决方案。唯一能让它变得更好的是,如果这个功能作为一个选项内置在 git 中。

“One liner”: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 as we know it 之前在您的设置中进行测试

此命令从远程创建功能分支作为普通分支(不是功能分支) - 如何解决这个问题?

如果您在分支名称中遇到“/”问题,下面有一个使用 git 别名的解决方案。请参阅“nobody”在“2013 年 5 月 15 日 11:02 回答”的回答

我只修剪 remotes/origin/ 以保留命名空间:for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done

解决方案4:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

使用 --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 FAQ: How do I clone a repository with all remotely tracked branches?

你知道这实际上似乎是一个很好的答案,即使它没有投票。这样做有什么陷阱吗?运行这些命令后,我必须明确签出一个分支。

这与 git push --mirror 相结合,正是我在从 github.com 迁移到 github 企业安装时创建远程 git repo 的精确副本所需要的。谢谢!

@Dave:添加最后一个 git checkout 作为最后一个命令,以最终检查克隆存储库上当前分支的头部。这是一个很好的答案,迄今为止最好的。勇敢点,最终我们会让你登上顶峰:-)

@戴夫:嗯。我有第二个想法: --mirror 不仅仅是将所有分支设置为被跟踪。它从原点复制所有引用,随后的 git remote update 将再次这样做。拉动行为发生变化。我重新相信完整的副本需要一个单行脚本。

git clone --mirror 非常适合备份您的 git 存储库 ^_^

解决方案5:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

您可以轻松切换到分支,而无需使用花哨的“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 --track /<分公司>

所以,如果你checkout的分支名称与远程分支的名称相同,“/”之后的所有内容,那么git会创建一个同名的分支,“/”之后的所有内容,“跟踪“那个遥控器?通过跟踪,我们的意思是:git push、git pull 等将在那个遥控器上完成?如果这是正确的,那么用更多信息扩展你的答案,因为我同意@Daniel,这个答案值得更多的代表。

@BullfrogBlues,您所有问题的答案似乎都是肯定的(我使用的是 git v1.7.7.4)。我同意应该更好地了解这种行为。 (这个版本的 git 的手册中没有。)我实际上不喜欢这种行为,我宁愿得到一个错误并且必须明确地说 git checkout --track origin/somebranch 。

@dubiousjim:实际上,这在手册中。 git-checkout(1) 说:“如果 未找到,但在一个具有匹配名称的远程(称为 )中确实存在跟踪分支,则视为等效于 'git checkout -b --track /' " (Git V.1.8.1.1)。

我们需要的是 $ git pull * /* - 其中“*”是一个通配符,所以它会拉出所有分支,包括那些尚未在本地系统上的分支。这个怎么做?我们真的应该签出/拉出每个分支只是为了将代码拉到我们的本地系统吗?

对我来说最重要的是,如果它不存在,它就不会创建一个。

解决方案6:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

关于,

git checkout -b 实验起源/实验

使用

git checkout -t origin/experimental

或者更冗长,但更容易记住

git checkout --track origin/experimental

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

所以你的意思是第二种形式更容易记住,没有其他区别?

解决方案7:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

您正在执行的 fetch 应该获取所有远程分支,但不会为它们创建本地分支。如果您使用 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 分支相同的点。请注意,它将获取所有分支,但只会将您所在的分支拉到树的顶部。

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

您在这里不需要参考/遥控器。 git checkout -b dev origin/dev 可以正常工作。

这将始终有效:git checkout -b newlocaldev --track origin/dev。如果您希望本地分支与远程分支具有相同的名称,并且远程分支没有棘手的名称,则可以省略 -b newlocaldev。使用默认的 branch.autosetupmerge 配置设置,并假设您没有名为 dev 的本地分支,这两个命令可能会做同样的事情:git checkout -b dev origin/dev 和只是简单的 git checkout dev。最后,git checkout origin/dev 不会创建新分支,而只是将您置于分离的 HEAD 状态。

当远程不再存在但 Git 太愚蠢而无法确认它已被删除时会发生什么?这假设您已更新并且 git branch -a 继续将其列为远程分支。

我们为几十个分支机构这样做?

解决方案8:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

使用别名。虽然没有任何原生 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

谢谢。与其他几个答案不同,这实际上克隆了所有远程分支

解决方案9:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

这是执行此操作的最佳方法:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

此时,您拥有远程存储库及其所有分支的完整副本(使用 git branch 验证)。如果您的远程存储库有自己的远程,您可以使用 --mirror 而不是 --bare。

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

在这里编辑时出了点问题。现在这个答案没有意义。最后一句中提到的“--bare”在给定的命令列表中不存在。

从下面戴夫的回答中获取。使用 'git config --bool core.bare false' 而不是 'git config unset core.bare' 似乎可以完成这项工作。

实际上是 git config --unset core.bare...对我来说,这似乎是此处答案中提出的所有解决方案中最干净的解决方案。可惜点赞这么少。。。

谢谢@ChrisSim 我同意git config --bool core.bare false。这就是我推荐使用 Dave's answer 的原因。您如何看待Dave's answer?干杯

这绝对是最佳答案,除了 @FedericoCapaldo gave an answer 更详细地说明了这些命令的具体作用。

解决方案10:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

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

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

git checkout -b branch origin/branchname

感谢您的注释“所有分支和标签都已获取”。我打算评论你的答案是错误的,但后来我检查了一下,发现你是完全正确的。所以在某种程度上,你提供了最短的答案——如果你克隆了,你已经有了它。好的。可以尝试添加:尝试 $ git branch -a 了解哪些远程分支已经可用。

看看我发布的答案。如果您知道要在许多远程分支上本地工作,而不必一一检查它们,这可能会有所帮助。

你能解释一下git checkout -b master origin/master和git checkout --track origin/master有什么区别吗?

@aderchox 如今,我认为没有。

解决方案11:

huntsbot.com – 高效赚钱,自由工作

为什么你只看到“大师”

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 即可查看本地分支)。

如果 origin/branchone 存在,您也可以只使用 git checkout branchone 创建同名的本地分支并将其设置为远程跟踪。

原文链接:https://www.huntsbot.com/qa/rD0b/how-do-i-clone-all-remote-branches?lang=zh_CN

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值