当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《跟踪所有远程git分支作为本地分支》经验,为你挑选了8个好方法。

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

$ 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

我用google搜索和RTM,但到目前为止已经上传了.



1> tjmcewan..:

Otto给出的答案是好的,但所有创建的分支都将以"origin /"作为名称的开头.如果您只想将最后一部分(在最后一个/之后)作为结果分支名称,请使用:

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

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


@adymitruk:实际上它的行为与我在OSX 10.6.4上对我说的一模一样,使用git 1.7.2.2(本评论中的最新稳定版).Otto甚至提到了模糊的refname警告 - 如果"origin /"不是每个本地分支名称的一部分,则不需要存在警告.这是运行Otto命令后的'git branch'输出:[master,origin/HEAD,origin/charts,origin/master,origin/production,origin/staging].我的命令:[图表,主人,制作,分期].
我同意 - 这是一个比目前"接受"的答案更好的解决方案.
而不是`grep -v master`,`grep -v/HEAD`怎么样?这似乎过滤掉了默认分支,无需自定义

2> Otto..:

使用bash:

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

学分: Val Blant,elias和Hugo

在git 1.9.1之前

注意:如果在更高版本的git(> v1.9.1)中使用以下代码会导致

    (bug)所有创建的分支来跟踪master

    (烦恼)所有创建的本地分支名称都带有前缀 origin/

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似乎更喜欢本地分支.


这在Git 1.9.1上对我没有用."git branch --track "创建一个新的分支,它跟踪本地分支主服务器,而不是我们想要的远程分支.所以这个脚本创建了一堆所有指向本地master的本地分支.我将在下面发布解决方案.
感谢关于refname警告的单挑.这很有帮助.

3> VonC..:

这是我使用的单线程(在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变量中指定的遥控器中选择上游分支(它可以是origin'或您为当前Git仓库的某个遥控器设置的任何名称).

它将提取分支的名称:origin/a/Branch/Name => a/Branch/Name通过awk表达式.

它将通过--set-upstream-to(或-u)设置上游分支,而不是--track:
优点是,如果分支已经存在,它将不会失败并且它不会更改该分支原点,它将仅配置该branch.xxx.(remote|merge)设置.

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

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


对于仅存在于遥控器上并且没有相应的本地分支的每个分支,这给了我"致命:分支","不存在".

4> slm..:

这里的大多数答案都过于复杂化了输出的解析git branch -r.您可以使用以下for循环来创建对远程上所有分支的跟踪分支,就像这样.

说我有这些远程分支.

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

确认我们没有在本地跟踪除master之外的任何内容:

$ 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,使用输出过滤输出中的任何HEAD或主分支grep -vE "HEAD|master".为了得到只有分支的名称减去origin/子字符串,我们使用Bash的字符串操作${var#stringtoremove}.这将从变量中删除字符串"stringtoremove" $var.在我们的例子中,我们origin/从变量中删除字符串$i.

注意:您也可以使用它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分支 - 远程分支



5> Dustin..:

你可以很容易地编写脚本,但我不知道它什么时候有价值.那些分支很快就会落后,你必须不断更新它们.

远程分支将自动保持最新,因此最简单的方法是在您真正想要处理它的位置创建本地分支.


那是个很好的观点.我正在考虑的主要用例是基于远程git存储库设置本地开发环境.因此,当我进行初始克隆时,我还希望跟踪当时的所有远程分支.

6> Val Blant..:
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done


我不得不添加一个`| grep -v HEAD`到管道以使其正常工作.

7> 小智..:

如果您想使用Powershell而您的遥控器称为Origin。然后工作。

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



8> 小智..:

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

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

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


原文(俄文).

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有