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

$ git branch
* master

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

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

当前回答

克隆存储库时,实际上会下载分支的所有信息,但分支是隐藏的。使用命令

$ git branch -a

您可以显示存储库的所有分支,并使用以下命令

$ git checkout -b branchname origin/branchname

然后,您可以一次手动下载一个。


然而,有一种更干净、更快的方法,尽管它有点复杂。您需要三个步骤来实现这一点:

第一步在计算机上创建一个新的空文件夹,并从存储库克隆.git文件夹的镜像副本:$cd~/桌面&&mkdir my_repo_folder&&cd my_repo-folder$git克隆--镜像https://github.com/planetoftheweb/responsivebootstrap.git.git位myepofolder文件夹中的本地存储库仍然是空的,现在只有一个隐藏的.git文件夹,您可以通过终端的“ls-alt”命令看到它。第二步通过将git配置的布尔值“裸”切换为false,将此存储库从空(裸)存储库切换为常规存储库:$git-config--bool core.bare false第三步获取当前文件夹中的所有内容,并在本地计算机上创建所有分支,因此这是一个正常的回购。$git重置--硬

现在您只需键入命令gitbranch,就可以看到所有的分支都已下载。

这是一种快速的方法,您可以一次克隆一个包含所有分支的git存储库,但这不是您想用这种方法为每个项目做的事情。

其他回答

只有这三个命令才能获得所有分支:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

如果您在这里寻求一个解决方案来获取所有分支,然后将所有内容迁移到另一个Git服务器,我将完成以下过程。如果您只想在本地更新所有分支,请停止在第一个空行。

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master|main/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

您可以通过以下单行命令获取所有分支:

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

我相信您已经通过以下方式克隆了存储库:

git clone https://github.com/pathOfrepository

现在使用cd转到该文件夹:

cd pathOfrepository

如果键入gitstatus,您可以看到所有:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

要查看所有隐藏的分支类型,请执行以下操作:

 git branch -a

它将列出所有远程分支。

现在,如果您想在任何特定分支上签出,只需键入:

git checkout -b localBranchName origin/RemteBranchName

对于使用PowerShell的Windows用户:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*?/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}; git fetch --all; git pull --all