git 从远程仓库拉取所有分支



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

如果我输入:

git branch -a

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

git branch 

我只看到其中的 2 个。

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

我知道我能做到:

git checkout --track origin/branch-name

但这一次只能拉出和检查一个分支。有什么方法可以一次完成所有工作,而无需一遍又一遍地运行 git checkout 的繁琐工作 - 跟踪来源/分支名称


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

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

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

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

  • 提取:从远程存储库获取内容(或更新)
  • 拉取:获取(如上所述)并一步合并

原始海报没有提到合并,所以我可能会用正确的 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

(为了确保您可以拔下网线,您将看到这些命令无需联系远程存储库即可工作。

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

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

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

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

简而言之:如果要确保在本地具有所有可用数据,则位于远程存储库只需使用git fetch [repo]。除非您调整了配置,否则这将获取所有分支,即更新现有的远程分支并创建新的远程分支(如果适用)。

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

(2) 此用例git worktree新功能。然而,截至2018年初,它仍然被标记为实验性

我通常用于使所有可见的上游分支和跟踪它们的命令在"将所有远程 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

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

我一直使用它,它工作得很好

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

你应该尝试这样的事情:-

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

最新更新