首页 文章

如何获取所有Git分支

提问于
浏览 1940 次
1040

我克隆了一个Git存储库,它包含大约五个分支 . 但是,当我做 git branch 时,我只看到其中一个:

$ git branch
* master

我知道我可以 git branch -a 看到 all 分支,但是我如何在本地拉出所有分支,所以当我做 git branch 时,它显示以下内容?

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

24 回答

  • 0

    克隆存储库时,实际下载了分支的所有信息,但隐藏了分支 . 随着命令

    $ git branch -a
    

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

    $ git checkout -b branchname origin/branchname
    

    然后,您可以一次手动“下载”它们 .


    然而,有一种更清洁,更快捷的方式,虽然它有点复杂 . 您需要三个步骤来完成此任务:

    • 第一步

    在您的计算机上创建一个新的空文件夹,并从存储库中克隆.git文件夹的镜像副本:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    文件夹my_repo_folder中的本地存储库仍为空,现在只有一个隐藏的.git文件夹,您可以从终端看到“ls -alt”命令 .

    • 第二步

    通过将git配置的布尔值“裸”切换为false,将此存储库从空(裸)存储库切换到常规存储库:

    $ git config --bool core.bare false
    
    • 第三步

    抓取当前文件夹中的所有内容并在本地计算机上创建所有分支,从而使其成为正常的repo .

    $ git reset --hard
    

    所以现在你可以输入命令 git branch ,你可以看到所有的分支都被下载了 .

    这是您可以快速克隆包含所有分支的git存储库的快速方法,但这不是您希望以这种方式为每个项目执行的操作 .

  • 101

    如果你这样做:

    git fetch origin
    

    然后他们将在当地 . 如果你然后执行:

    git branch -a
    

    你会看到它们被列为遥控器/原点/分支名称 . 因为他们在当地,你可以随心所欲地做任何事情 . 例如:

    git diff origin/branch-name
    

    要么

    git merge origin/branch-name
    

    要么

    git checkout -b some-branch origin/branch-name
    
  • 7

    这是在接受的答案中提供的Perl版本的单行程序:

    git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

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

    我们意外删除了Stash项目存储库 . 幸运的是,有人在意外丢失之前创造了一个分叉 . 我把叉子克隆到我的本地(将省略我如何做的细节) . 一旦我把叉子完全放在我当地,我跑了一个单线 . 我修改了远程的URL(在我的情况下来源),指向我们正在恢复的目标存储库:

    git remote set-url origin <remote-url>

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

    git push --all origin

    我们又回来了 .

  • 27

    您需要创建跟踪远程分支的本地分支 .

    假设您只有一个名为 origin 的遥控器,此片段将为所有远程跟踪的远程创建本地分支:

    for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done
    

    之后, git fetch --all 将更新远程分支的所有本地副本 .

    此外, git pull --all 将更新本地跟踪分支,但根据您的本地提交以及如何设置'merge' configure选项,它可能会创建合并提交,快进或失败 .

  • 5

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

    你可以找到最新版本here

    #!/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 "[email protected]" ) 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>
    

    它像往常一样克隆,但为所有远程分支创建本地跟踪分支 .

  • 4

    对于使用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
    
  • 166

    循环似乎对我不起作用,我想忽略原点/主人 . 这对我有用 .

    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
    
  • 9
    git remote add origin https://yourBitbucketLink
    
    git fetch origin
    
    git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)
    

    现在本地你的 yourNewLocalBranchName 就是你的 requiredRemoteBranch .

  • 1

    只有这三个命令将获得所有分支

    git clone --mirror repo.git  .git     (gets just .git  - bare repository)
    
    git config --bool core.bare false         
    
    git reset --hard
    
  • 13

    我相信你已经克隆了存储库

    git clone https://github.com/pathOfrepository
    

    现在使用cd转到该文件夹

    cd pathOfrepository
    

    如果输入 git status

    你可以看到所有

    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
    
  • 29
    $ git remote update
    $ git pull --all
    

    这假定跟踪所有分支 .

    如果不是,你可以在Bash中解雇:

    for remote in `git branch -r `; do git branch --track $remote; done
    

    然后运行该命令 .

  • 2

    我通常只使用这样的命令:

    git fetch origin
    git checkout --track origin/remote-branch
    

    更短的版本:

    git fetch origin
    git checkout -t origin/remote-branch
    
  • 1

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

    git clone <ORIGINAL_ORIGIN>
    git branch -r | awk -F'origin/' '!/HEAD|master/{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>
    
  • 0

    如果你有fetch --all的问题

    然后跟踪您的远程分支

    git checkout --track origin /%branchname%

  • 477

    这是我认为强大的东西:

    • 不更新现有分支的远程跟踪

    • 不尝试更新 HEAD 以跟踪 origin/HEAD

    • 允许名为 origin 以外的遥控器

    • 正确引用shell

    for b in $(git branch -r --format='%(refname:short)'); do
      [[ "${b#*/}" = HEAD ]] && continue
      git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
    done
    git pull --all
    

    它的没有必要 git fetch --all 传递 -allgit pull 将此选项传递给内部 fetch .

    感谢this answer .

  • 13

    根据Learath2的回答,这是我在创建目录后 git clone [...]cd -ing所做的事情:

    git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

    为我工作,但我不知道它对你有用 . 小心 .

  • 23

    bash for循环对我来说不起作用,但这完全符合我的要求 . 来自我的所有分支在本地镜像为相同的名称 .

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

    编辑:见下面的Mike DuPont评论 . 我想我试图在Jenkins服务器上执行此操作,使其处于分离头模式 .

  • 2

    您可以通过以下方式获取所有分支:

    git fetch --all
    

    要么:

    git fetch origin --depth=10000 $(git ls-remote -h -t origin)
    

    如果您使存储库变浅,则--depth = 10000参数可能会有所帮助 .


    要拉出所有分支,请使用:

    git pull --all
    

    如果以上不起作用,则在上面的命令之前加上:

    git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
    

    因为 remote.origin.fetch 在获取时只能支持特定的分支,特别是当你用 --single-branch 克隆你的回购时 . 通过以下方式检查: git config remote.origin.fetch .

    之后你应该能够结账任何分支机构 .

    也可以看看:


    要将所有分支推送到远程,请使用:

    git push --all
    

    最终 --mirror 镜像所有参考 .


    如果您的目标是复制存储库,请参阅:GitHub上的文章Duplicating a repository .

  • 19

    克隆主存储库后,您就可以执行了

    git fetch && git checkout <branchname>
    
  • 8

    确保 .git/config 文件中的所有远程分支都可以获取 .

    在此示例中,只有 origin/production 分支是可获取的,即使您尝试执行 git fetch --all 也不会发生任何事情,只需获取 production 分支:

    [origin]
    fetch = +refs/heads/production:refs/remotes/origin/production
    

    该行应替换为:

    [origin]
    fetch = +refs/heads/*:refs/remotes/origin/*
    

    然后运行 git fetch 等...

  • 1404

    使用 git fetch && git checkout RemoteBranchName .

    它对我来说效果很好......

  • 47

    我们可以将所有分支或标记名称放在一个临时文件中,然后为每个名称/标记执行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
    
  • 39

    列出远程分支:
    git branch -r

    您可以将它们作为本地分支机构查看:
    git checkout -b LocalName origin/remotebranchname

  • 0

    您可以从所有遥控器中获取一个分支,如下所示:

    git fetch --all
    

    fetch 更新远程分支的本地副本,因此对于本地分支机构来说,这始终是安全的 BUT

    • fetch 不会 update 本地分支机构( track 远程分支机构);如果要更新本地分支,则仍需要拉出每个分支 .

    • fetch 不会 create 本地分支机构( track 远程分支机构),您必须手动执行此操作 . 如果要列出所有远程分支: git branch -a

    update 跟踪远程分支的本地分支:

    git pull --all
    

    但是,这仍然不够 . 它仅适用于跟踪远程分支的本地分支 . 要跟踪所有远程分支,请执行此oneliner BEFORE git pull --all

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

    TL; DR版本

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

    (似乎拉取所有遥控器的所有分支,但我总是首先获取以确定)

    仅当服务器上存在未由本地分支跟踪的远程分支时,才运行第一个命令 .

    附: AFAIK git fetch --allgit remote update 是等价的 .



    Kamil Szot的comment,其中74人(至少)认为有用 .

    我不得不在git branch -r中使用:for remote;做git branch --track $ {remote#origin /} $ remote; DONE
    因为你的代码创建了名为origin / branchname的本地分支,而且每当我提到它时,我的“refname”origin / branchname'都是模糊的 .

相关问题