39

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

如果我输入:

git branch -a

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

git branch 

我只看到其中2个。

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

我知道我可以做到:

git checkout --track origin/branch-name

但这一次只能拉出并检查一个分支。git checkout --track origin/branch-name有什么方法可以一次完成所有工作,而无需一遍又一遍地进行繁琐的工作?


附言。我尝试了以下命令,它们都没有使远程分支出现在我的git branch列表中:

git fetch --all
git remote update
git pull --all
4

4 回答 4

21

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

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

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

原始海报没有提到合并,所以我可能会用正确的 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/... 的分支称为远程分支,但它们已经被提取到您的存储库中。它们是只读的,您不能修改它们(这就是结帐时出现消息的原因)。尽管它们反映了最后一次 fetch 或 pull 操作时远程 repo 的状态,但它们实际上存储在本地。

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

git 工作区一次包含一个分支的状态。所以你关于一次检查所有远程分支的问题在 git 的上下文中并没有真正的意义。您可以一个接一个地检查它们。但是每次检查下一个时,前一个都会从工作区域中消失。当然,此操作可以编写脚本,如Track all remote git branch as local branches中所示。但是,如果只剩下最后一步,编写大规模操作的脚本又有什么意义呢?

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

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

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

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

于 2013-09-19T12:44:14.483 回答
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

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

于 2013-09-20T07:36:48.323 回答
8

我一直用这个而且效果很好

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all
于 2018-03-16T11:29:18.653 回答
3

您应该尝试以下方法:-

$ git fetch --all
$ for branch in `git branch -r | cut -d '/' -f2-` ; do git checkout $branch && git pull origin $branch ; done
于 2016-05-24T15:22:06.980 回答