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

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

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

$ git push --all origin

我想做相反的事情。如果我在一个源上有X个远程分支:

$ git branch -r 
branch1
branch2
branch3
.
.
.

我是否可以为所有这些远程分支创建本地跟踪分支,而不需要手动创建每个分支?可以这样说:

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

我用谷歌搜索了一下,但到目前为止都是胡扯。


当前回答

Otto给出的答案很好,但是所有创建的分支都将“origin/”作为名称的开头。如果你只是想让最后一部分(在最后一个/之后)作为你的分支名称,使用这个:

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

它还有一个好处,就是不会给你任何关于模糊引用的警告。

其他回答

VonC的解决方案可以通过改变sed进一步简化(我缺乏代表点直接评论他的帖子):

for branch in $(git branch -r | sed 's,[^/]*/,,g'); do git switch $branch; done

通过替换所有非斜杠直到最后一个斜杠的内容,剩余的分支名称适合本地使用;重复切换到同一个分支并不是错误(这可能效率较低,但可能比在管道中使用grep:->更有效)。

switch命令足够智能,可以根据需要跟踪每个远程分支。

不需要任何脚本(在空目录中):

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

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


原文(俄语)。

以下是我的BASH命令引用@tjmcewan的解决方案:

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

Otto给出的答案很好,但是所有创建的分支都将“origin/”作为名称的开头。如果你只是想让最后一部分(在最后一个/之后)作为你的分支名称,使用这个:

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

它还有一个好处,就是不会给你任何关于模糊引用的警告。

以防您已经签出了一些分支并想要

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

您可以使用以下兼容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