跟踪所有远程git分支作为本地分支

将一个远程分支作为本地分支进行跟踪非常简单。

$ git checkout --track -b ${branch_name} origin/${branch_name} 

将所有本地分支推送到远程,根据需要创建新的远程分支也很容易。

 $ git push --all origin 

我想做相反的事。 如果我有一个远程分支机构在一个单一来源:

 $ git branch -r branch1 branch2 branch3 . . . 

我可以创建所有这些远程分支的本地跟踪分支,而无需手动创建每个分支? 说一些像:

 $ git checkout --track -b --all origin 

我已经google和RTM,但到目前为止已经上床。

使用bash:

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

更新分支,假设您的本地跟踪分支没有变化:

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

忽略模棱两可的refname警告,git似乎更喜欢本地分支。

Otto给出的答案是好的,但是所有创建的分支都会有“origin /”作为名字的开始。 如果你只是想把最后一部分(最后一个部分)作为你的结果分支名称,使用这个:

 for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done 

它也有没有给你任何关于含糊不清的refs的警告。

这里是我使用的单线程(在bash shell中,用msysgit1.7.4测试):

复制粘贴:

 remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream-to $remote/$brname $brname; done 

更多的可读性:

 remote=origin ; // put here the name of the remote you want for brname in ` git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}' `; do git branch --set-upstream-to $remote/$brname $brname; done 
  • 它只会选择remote变量中指定的remote上游分支(它可以是“ origin ”,或者您为当前Git仓库的其中一个远程仓库设置的任何名称)。
  • 它将通过awk表达式提取分支的名称: origin/a/Branch/Name => a/Branch/Name
  • 它会设置上游分支通过--set-upstream-to (或-u ) ,而不是--track
    好处是,如果分支已经存在,它不会失败,并且不会改变分支原点,它只会配置branch.xxx.(remote|merge)设置。

     branch.aBranchName.remote=origin branch.aBranchName.merge=refs/heads/a/Branch/Name 

该命令将为所有远程上游分支创建本地分支,并将其远程和合并设置设置为该远程分支。

这里的大部分答案都是复杂的git branch -r输出的解析。 您可以使用以下for循环来创建针对远程所有分支的追踪分支。

说我有这些偏远的分支。

 $ git branch -r origin/HEAD -> origin/master origin/development origin/integration origin/master origin/production origin/staging 

确认我们没有在主机上追踪任何东西,在本地:

 $ git branch -l # or using just git branch * master 

您可以使用这一个班轮创建跟踪分支:

 $ for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done Branch development set up to track remote branch development from origin. Branch integration set up to track remote branch integration from origin. Branch production set up to track remote branch production from origin. Branch staging set up to track remote branch staging from origin. 

现在确认:

 $ git branch development integration * master production staging 

删除它们:

 $ git br -D production development integration staging Deleted branch production (was xxxxx). Deleted branch development (was xxxxx). Deleted branch integration (was xxxxx). Deleted branch staging (was xxxxx). 

如果你使用-vv开关来git branch你可以确认:

 $ git br -vv development xxxxx [origin/development] commit log msg .... integration xxxxx [origin/integration] commit log msg .... * master xxxxx [origin/master] commit log msg .... production xxxxx [origin/production] commit log msg .... staging xxxxx [origin/staging] commit log msg .... 

for循环的细分

循环基本上调用命令git branch -r ,使用grep -vE "HEAD|master"过滤掉输出中的任何HEAD或master分支。 为了得到分支的名字减去origin/子串,我们使用Bash的字符串操作${var#stringtoremove} 。 这将从变量$var移除字符串“stringtoremove”。 在我们的例子中,我们从变量$i删除字符串origin/

注意:或者你也可以使用git checkout --track ...来做到这一点:

 $ for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); do git checkout --track $i; done 

但是我不特别关心这个方法,因为它在执行结账时将其切换到分支中。 完成后,会将其留在创建的最后一个分支上。

参考

  • 10.1。 操纵字符串 – 高级Bash脚本指南
  • 3.5 Git分支 – 远程分支

你可以很容易地脚本,但我不知道什么时候有价值。 那些分支很快就会落后,你不得不一直更新它们。

远程分支会自动保持最新状态,所以最简单的方法就是在实际需要的地方创建本地分支。

 for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done 
 for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do git branch --track ${branch##*/} $branch; done 

使用这个,你不会有这样的警告:refname'origin / dev'是不明确的

要像tjmcewan的答案一样,但在Windows上,请从批处理文件中调用:

 for /f "delims=" %%r in ('git branch -r ^| grep -v master') do git checkout --track %%r 

或者从命令行

 for /f "delims=" %r in ('git branch -r ^| grep -v master') do git checkout --track %r 

没有任何脚本(在一个空目录中):

 $ git clone --bare repo_url .git $ git config core.bare false $ git checkout 

之后,所有远程分支将被视为本地。


原始(俄语) 。

这里是我通过@tjmcewan引用的BASH命令的解决方案:

 for remote in `git branch -r | grep -v /HEAD `; do git branch --track ${remote/"origin/"/""}; done 

我的目标是解决所有创建的分支将具有“origin /”作为名称的开始的问题,因为我测试了$ remote变量仍然包含“origin /”:

 for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done 

如果你想使用PowerShell而你的远程被称为起源。 然后这工作。

 git fetch git branch -r | %{$_ -replace " origin/"} | %{git branch --track $_ "origin/$_"} 

如果你已经有一些分支签出,并希望

  • 从远程检查所有剩余的分支
  • 确保所有本地分支机构都跟踪远程分支机构

你可以使用下面的bash和zsh兼容的脚本:

 git branch -r | while read b; do if git branch | grep -q " ${b##*/}$"; then git branch --set-upstream ${b##*/} $b; else git branch --track ${b##*/} $b; fi; done 
 for rembranch in `git remote update 2>&1 > /dev/null ; git branch -r|egrep -wv "HEAD|master"` do git checkout --track -b `echo $rembranch|awk -F\/ '{print $2}'` $rembranch; done 

说明:

第1行:'git branch -r'(后面跟着'git remote update'来更新远程更改的信息)列出所有远程分支; 'egrep -vw'用于敲击有HEAD和主结果的条目。

第3行:跟踪指定的远程分支,同时检查本地。 一个简单的awk被用来避免“origin /”作为本地分支的后缀。