如何获取所有的git分支

我克隆了一个包含大约5个分支的git仓库。 但是,当我做git branch我只能看到其中之一:

 $ git branch * master 

我知道我可以做git branch -a来查看所有的分支,但是我怎样才能把所有的分支都拉到本地,所以当我做git branch ,它显示:

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

我前一段时间写了我的答案,最后downvote激励我用我以后的经验更新:-)

编辑:此答案的以前版本创build分支与“原始”前缀,都指向主分支,而不是实际的分支,并有variables扩展的问题。 这已根据意见得到修复。

你可以像这样从所有的遥控器中获取一个分支:

 git fetch --all 

fetch更新远程分支的本地副本,所以这对您的本地分支始终是安全的但是

  1. fetch不会更新本地分支( 跟踪远程分支); 如果你想更新你的本地分行,你仍然需要拉动每一个分行。

  2. fetch不会创build本地分支( 跟踪远程分支),您必须手动执行此操作。 如果你想列出所有的远程分支: git branch -a

更新追踪远程分行的本地分行:

 git pull --all 

但是,这可能还是不够的。 它只适用于跟踪远程分支机构的当地分行。 跟踪所有的远程分支执行这个oneliner 之前 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 

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

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

PS AFAIK git fetch --allgit remote update是等价的。



卡米尔·斯佐(Kamil Szot) 评论说 ,至less74人(至less)认为有用。

我不得不使用:

 for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done 

因为你的代码创build了名为origin/branchname本地分支,而且当我引用它的时候,“refname'origin / branchname'是不明确的。

要列出远程分支:
git branch -r

您可以通过以下方式查看当地分行:
git checkout -b LocalName origin/remotebranchname

由于原来的答案完全忽略了这一点,一个编辑被拒绝了,这里有一个简洁的答案:

您将需要创build本地分行跟踪远程分行。

假设你只有一个远程调用的origin ,这个片段将创build所有远程跟踪的本地分支:

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

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

此外, git pull --all将更新您的本地跟踪分支,但取决于您的本地提交以及如何设置“合并”configuration选项,它可能会创build一个合并提交,快进或失败。

如果你这样做:

 git fetch origin 

那么他们将全部在当地。 如果你然后执行:

 git branch -a 

你会看到他们列为远程/起源/分支名称。 既然他们在当地,你可以随心所欲地做任何事情。 例如:

 git diff origin/branch-name 

要么

 git merge origin/branch-name 

要么

 git checkout -b some-branch origin/branch-name 
 $ git remote update $ git pull --all 

这假定所有分支都被跟踪

如果他们不是,你可以在bash中开火

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

然后运行该命令。

怎么样git fetch && git checkout RemoteBranchName ? 对我来说工作得非常好

bash for循环对我不起作用,但这正是我想要的。 所有来自我的起源的分支在本地镜像为相同的名称。

 git fetch origin '+refs/heads/*:refs/heads/*' 

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

 $ git branch -a 

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

 $ git checkout -b branchname origin/branchname 

您可以一次手动“下载”它们。


不过,有一种更干净更快捷的方式,虽然有点复杂。 你需要三个步骤来完成这个:

  1. 第一步

    在您的计算机上创build一个新的空文件夹,并从存储库中克隆.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文件夹,您可以从terminal看到“ls -alt”命令。

  2. 第二步

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

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

    抓住当前文件夹内的所有内容,并创build本地机器上的所有分支,因此使这是一个正常的回购。

     $ git reset --hard 

所以,现在你可以input命令git branch ,你可以看到所有的分支下载。

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

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

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

稍微缩短版本:

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

如果你在这里寻求一个解决scheme来获得所有的分支,然后把所有的东西都迁移到另一个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 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 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克隆你的repo。 检查这个: git config remote.origin.fetch

之后,你应该可以签出任何分支。

也可以看看:

  • 如何获取所有远程分支机构?
  • 如何在Git中克隆所有远程分支?

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

 git push --all 

最终 – 镜像镜像所有裁判。


如果您的目标是复制存储库,请参阅:在GitHub上复制存储库文章。

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

 git fetch && git checkout <branchname> 

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

 git clone https://github.com/pathOfrepository 

现在使用cd进入该文件夹

 cd pathOfrepository 

如果你inputgit status

你可以看到所有的

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

看到所有隐藏的分支types

  git branch -a 

它会列出所有的远程分支

现在如果你想签出任何特定的分支只是input

 git checkout -b localBranchName origin/RemteBranchName 

循环似乎没有为我工作,我想忽略起源/主。 这是为我工作的。

 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 

只是这3个命令将得到所有的分支

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

我写了一个小脚本来pipe理克隆一个新的回购和为所有的远程分支设立本地分支机构。

你可以在这里find最新的版本:

 #!/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> 

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

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

在这个例子中,只有origin/production分支是可以获取的,即使你尝试做git fetch --all除了获取production分支之外,

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

这行应该被replace为:

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

然后运行git fetch等…

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

根据Learath2的回答,以下是我在做git clone [...]cd -ing到创build的目录后所做的工作:

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

为我工作,但我不知道它会为你工作。 小心。

我们可以把所有的分支或标签名称放在一个临时文件中,然后做每个名称/标签的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 
 git remote add origin https://yourBitbucketLink git fetch origin git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D) 

现在你的yourNewLocalBranchName是你的requiredRemoteBranch

 git fetch --all 

这将为您取回所有分支,然后您可以结帐到您想要的分支

 get checkout YOUR_BRANCH 

希望这可以帮助。