我克隆了一个包含许多分支的Git存储库。然而,git分支仅显示一个:

$ git branch
* master

我如何在本地拉所有分支,所以当我执行git分支时,它会显示以下内容?

$ git branch
* master
* staging
* etc...

当前回答

我们可以将所有分支或标记名称放在一个临时文件中,然后对每个名称/标记执行git pull:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done

其他回答

Bash for循环不适合我,但这正是我想要的。我的所有分支在本地镜像为相同的名称。

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

请参见下面Mike DuPont的评论。我想我是在Jenkins服务器上做这件事的,这让它处于分离头部模式。

我写了一个小脚本来管理克隆一个新的repo,并为所有远程分支创建本地分支。

您可以在此处找到最新版本:

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

要使用它,只需将其复制到git bin目录中(对我来说,这是C:\Program Files(x86)\git\bin\git cloneall),然后在命令行上:

git cloneall [standard-clone-options] <url>

它照常克隆,但为所有远程分支创建本地跟踪分支。

克隆主存储库后,您只需执行

git fetch && git checkout <branchname>

太长,读不下去了为每个远程跟踪分支创建一个本地分支可能是个坏主意。这些不同类型的分支机构用于不同的目的,通常根据其需要创建本地分支机构。gitbranch显示本地分支gitbranch-r显示远程跟踪分支。gitbranch-a同时显示两者。您可以使用适当的fetch命令更新所有远程跟踪分支。这通常是你所需要的。


滚动浏览现有答案后,我发现有两种:一种是简单地回答问题,而不是建议不同的方法。而那些建议了一种不同的方法,但没有解释原因。这是我想再解释一点的地方。

通常的git存储库实际上需要处理三种分支。这三种分支有不同的用途。简而言之:

远程分支:这些是存在于远程存储库中的分支。您永远不会直接从远程分支读取。所有远程分支的读取都是通过git进行的,称为“远程跟踪分支”远程跟踪分支:git保存远程分支的本地快照,最准确的说法是“远程跟踪分支”。当您调用git fetch或git pull(执行fetch)时,它们会更新。您通常可以使用远程跟踪分支,而无需创建本地分支。例如:git合并原始/主将远程跟踪分支原始/主分支合并到当前本地分支,而无需先创建其本地副本。这意味着:有一个名为origin/master的远程跟踪分支,它是名为master的分支的快照,因为它存在于名为origin的远程存储库中。此命令将其合并到当前签出的本地分支中。在执行类似操作之前,您可能需要执行一次提取。本地分支:这些是历史上某些点的手动创建的快照(通常至少首先基于远程跟踪分支)。它们比其他类型静态得多,只有在手动更改它们时才会真正更改。逐一地。如果希望在工作树(项目目录)中查看其内容,或者希望向其添加提交,则可能需要本地分支。

一旦你完成了本地分支机构(并发布了其内容),你可以考虑删除它。这样你就不需要保持它的最新状态。毕竟,fetch不会更新当前本地分支,pull只会更新当前签出的本地分支。换言之:您应该只在需要时创建本地分支,而在不再需要时可能应该删除它们。

说“某些分支默认隐藏”可能不准确。相反,创建gitbranch命令是为了显示“本地分支”。您可以使用gitbranch-r列出远程跟踪分支,使用gitbranch-a显示本地分支和远程跟踪分支。这两种不同类型的分支用于不同的目的,您不可能需要为每个远程跟踪分支设置本地分支。

还要注意,创建本地分支通常是一个坏主意,其名称以远程的名称开头,后跟斜杠(例如,创建一个名为“origin/master”的本地分支往往是一个糟糕的主意,因为它的名称与远程跟踪分支的名称冲突)。

在更新分支的上下文中,讨论不同风格的fetch命令是有意义的:

gitfetch:仅更新远程跟踪分支,这些分支的远程与当前签出分支的“上游”中使用的分支相匹配。如果签出的分支没有上游集合,则返回到从名为“origin”的远程获取(如果存在)。这个命令是最简单的,并且在大多数时间都足够了。gitfetch--all:更新所有远程跟踪分支,而不管它们属于哪个远程。

我特别喜欢

git fetch -tf --all

它还将始终更新(并在需要时覆盖)所有标记,包括无法从远程分支访问的标记。

对于Visual Studio用户,在包管理器控制台上:

git branch | %{ git fetch upstream; git merge upstream/master}