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

$ git branch
* master

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

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

当前回答

git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

现在本地您的NewLocalBranchName是您所需的RemoteBranch。

其他回答

我写了一个小脚本来管理克隆一个新的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>

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

你看不到远程分支,因为你没有跟踪它们。

确保您正在跟踪所有远程分支(或要跟踪的任何分支)。更新本地分支以反映远程分支。


跟踪所有远程分支:

跟踪远程回购中存在的所有分支。

手动执行:

您可以将<branch>替换为gitbranch-r输出中显示的分支。

git branch -r
git branch --track <branch>

使用bash脚本执行:

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

懒惰的方式(由于合并冲突,这可能会造成混乱,请小心):

git checkout master
git pull

更新本地计算机上远程分支的信息:

这将从您正在本地回购中跟踪的远程回购中获取分支的更新。这不会改变您的本地分支。您的本地git回购现在知道远程回购分支上发生的事情。一个例子是,一个新的提交被推送到远程主机,执行一个fetch将提醒您本地主机落后于一个提交。

git fetch --all

更新本地计算机上远程分支的信息并更新本地分支:

对从远程分支到本地分支的所有分支执行一次提取,然后进行一次合并。例如,一个新的提交已被推送到远程主机,执行拉取操作将更新远程分支中的更改的本地回购,然后将这些更改合并到本地分支中。由于合并冲突,这可能会造成相当混乱。

git pull --all

循环似乎对我不起作用,我想忽略起源/主。这是对我有用的。

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

之后:

git fetch --all
git pull --all

下面是接受答案中提供的一行程序的Perl版本:

git branch-r | perl-e'while(<>){chop;my$remote=$_;my($local)=($remote=~/origin\/(.*)/);打印“git branch--track$local$remote\n”;}'>一些输出文件

如果愿意,可以将输出文件作为Shell脚本运行。

我们无意中删除了Stash项目存储库。幸运的是,就在意外损失之前,有人制造了一个叉子。我将叉子克隆到了我的本地(将省略我是如何做到这一点的细节)。当我把叉子完全放在本地时,我跑了一条单行道。我修改了远程服务器的URL(在我的例子中是源URL),以指向我们要恢复到的目标存储库:

gitremoteseturl-origin<remoteurl>

最后将所有分支都推到原点,如下所示:

git push—所有原点

我们又回到了生意上。

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

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

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