关于版本控制:git从远程存储库中提取所有分支

git pull all branches from remote repository

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

如果我键入:

1
git branch -a

我得到一长串分支,但如果我键入:

1
git branch

我只看到其中两个。

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

我知道我能做到:

1
git checkout --track origin/branch-name

但一次只能抽出一个分支进行检查。如果不运行GIT结帐这样一个冗长的工作——一遍又一遍地跟踪源站/分支名称,有没有办法一次完成所有的工作?

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

1
2
3
git fetch --all
git remote update
git pull --all


请阅读以下说明:http://git-scm.com/book/en/git-branching-remote-branches

首先,让我们澄清一些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

(为了确保您可以卸下网线,您将看到命令在不联系远程repo的情况下工作。)

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

如果您执行git checkout some-branch,并且某些分支尚不存在,但存在远程/源站/某些分支,那么git将为您创建一个称为某些分支的跟踪分支(1)。同样,这是一个本地操作,所有数据以前都已被提取过(或者,如果您最近没有提取过,您将开始处理过时的版本)。跟踪分支的内容最初与远程分支相同。但是,您可以在本地修改跟踪分支。

Git工作区包含一个分支的状态。因此,在Git上下文中,您关于立即签出所有远程分支的问题实际上没有意义。你可以一个接一个地检查它们。但是每次你检查下一个,前一个就会从工作区消失。当然,可以按照track all remote git branch中显示的本地分支编写此操作的脚本,但是如果只剩下最后一步,那么编写大规模操作的脚本有什么意义呢?

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

很快:如果要确保在本地有所有可用的数据,远程回购只使用git fetch [repo]。除非您对配置进行了调整,否则这将获取所有分支,即更新现有的远程分支,并在适用时创建新的远程分支。

(1)这在简单的标准情况下是正确的。在具有多个远程或手动配置的远程的更复杂的情况下,您可能需要--track选项来精确地指定所需的内容。

(2)这个用例有一个新特性git worktree。然而,截至2018年初,它仍处于试验阶段。


我通常使用的命令使所有可见的上游分支,跟踪它们在"将所有远程Git分支作为本地分支跟踪"中有详细说明:

1
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

或:

1
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

For more readability:

1
2
3
4
5
6
7
8
9
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

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


我一直用这个,它很好用

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


你应该尝试以下方法:

1
2
$ git fetch --all
$ for branch in `git branch -r | cut -d '/' -f2-` ; do git checkout $branch && git pull origin $branch ; done