Git 从远程存储库拉取所有分支

问题描述 投票:0回答:4

如何将所有远程分支拉到我自己的存储库?

如果我输入:

git branch -a

我得到了一长串分支列表,但如果我输入:

git branch

我只看到其中两个。

如何将所有分支拉入我的本地列表?

我知道我能做到:

git checkout --track origin/branch-name

但这一次只能拉出并检查一个分支。有没有一种方法可以一次性完成所有工作,而无需一遍又一遍地运行

git checkout --track origin/branch-name
的繁琐工作?


PS:我尝试了以下命令,但没有一个命令使远程分支出现在我的

git branch
列表中:

git fetch --all
git remote update
git pull --all
git version-control git-branch remote-branch
4个回答
24
投票

阅读例如这个解释http://git-scm.com/book/en/Git-Branching-Remote-Branches

首先让我们澄清一些 git 术语:

  • fetch:从远程存储库获取内容(或更新)
  • pull:一步获取(如上)并合并

原始海报没有提到合并,所以我可能会用正确的 git 术语来猜测 他甚至可能想问“git 从远程存储库获取所有分支”

如果您在

git branch -a
中看到分支,那么您已经获取了它们。 您可以通过发出命令
git show remotes/origin/some-branch:some-file

来验证这一点

或者可以做,例如

git diff remotes/origin/some-branch master

您甚至可以查看它们

git checkout remotes/origin/some-branch

(确保您可以拔掉网络电缆,并且您将看到命令可以在不联系远程存储库的情况下工作。)

名为remotes/...的分支称为远程分支,但它们已经被提取到您的存储库中。它们是只读的,您无法修改它们(这就是签出时出现一条消息的原因)。尽管它们反映了上次获取或拉取操作时远程存储库的状态,但它们实际上存储在本地。

如果你这样做了

git checkout some-branch
并且 some-branch 尚不存在,但远程/origin/some-branch 存在,git 将为你创建一个名为 some-branch 的跟踪分支 (1)。同样,这是本地操作,所有数据之前都已获取(或者如果您最近没有获取,您将开始使用过时的版本)。最初,跟踪分支的内容与其远程分支相同。但是,您可以在本地修改跟踪分支。

git工作区一次包含一个分支的状态。因此,关于立即检查所有远程分支的问题在 git 上下文中并没有真正意义。您可以逐一查看它们。但每次您查看下一个时,前一个都会从工作区域中消失。当然,这个操作可以编写脚本,如将所有远程 git 分支作为本地分支跟踪所示,但是如果只剩下最后一步,那么编写大规模操作的脚本有什么意义呢?

那么问题是否是由误解引起的,假设远程分支仅存储在远程,而不存储在本地,而您只是想确保所有内容都存储在本地?如果您确实想一次检出多个分支,您可以在本地克隆您的存储库,并将不同的分支检出到不同的工作区域。 (2)

Shortly:如果您想确保本地拥有所有可用的数据 远程仓库只需使用

git fetch [repo]
。除非您调整了配置,否则这将获取所有分支,即更新现有远程分支并创建新的远程分支(如果适用)。

(1) 在简单的标准情况下这是正确的。在具有超过 1 个遥控器或手动配置遥控器的更复杂的情况下,您可能需要 --track 选项来准确指定您想要的内容。

(2) 此用例有一个新功能

git worktree
。然而截至 2018 年初,它仍处于实验阶段


21
投票

我通常用来使所有可见的上游分支以及跟踪它们的命令在“将所有远程git分支作为本地分支跟踪”中有详细介绍:

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream-to $remote/$brname $brname ; done

或者:

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/[^\/]+\//,"",$1); print $1}'`; do git branch --track $brname $remote/$brname  ; done

为了提高可读性:

remote=origin ; // put here the name of the remote you want
for brname in `
  git branch -r | grep $remote | grep -v master | grep -v HEAD 
  | awk '{gsub(/[^\/]+\//,"",$1); print $1}'
`; do 
  git branch --set-upstream-to $remote/$brname $brname; 
  # or
  git branch --track $brname  $remote/$brname ; 
done

第二个用于创建新的本地分支来跟踪远程分支。


17
投票

我一直用这个,效果很好

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

6
投票

你应该尝试这样的事情:

git fetch --all
for branch in `git branch -r | cut -d '/' -f2-` ; do git checkout $branch && git pull origin $branch ; done
© www.soinside.com 2019 - 2024. All rights reserved.