将单个远程分支作为本地分支进行跟踪非常简单。
$ 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,但到目前为止已经上传了。
答案 0 :(得分:181)
Otto给出的答案是好的,但所有创建的分支都将以“origin /”作为名称的开头。如果您只想将最后一部分(在最后一个/之后)作为结果分支名称,请使用:
for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done
它还有一个好处,就是不会给你任何关于模糊引用的警告。
答案 1 :(得分:90)
使用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
在git 1.9.1之前学分: Val Blant,elias和Hugo
注意:以下代码(如果在更高版本的git(> v1.9.1)中使用)会导致
- (bug)所有已创建的分支以跟踪主
- (烦恼)所有创建的本地分支名称都以
为前缀 醇>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似乎更喜欢本地分支。
答案 2 :(得分:21)
这是我使用的单线程(在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
。它将设置上游分支through --set-upstream-to
(or -u
),而不是--track
:
优点是,如果分支已经存在,它将不会失败并且不会更改该分支原点,它将仅配置branch.xxx.(remote|merge)
设置。
branch.aBranchName.remote=origin
branch.aBranchName.merge=refs/heads/a/Branch/Name
该命令将为所有远程上游分支创建本地分支,并将其远程和合并设置设置为该远程分支。
答案 3 :(得分:19)
这里的大部分答案都使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 ....
循环基本上调用命令git branch -r
,使用grep -vE "HEAD|master"
过滤掉输出中的任何HEAD或主分支。为了获得仅仅分支的名称减去origin/
子字符串,我们使用Bash的字符串操作${var#stringtoremove}
。这将从变量$var
中删除字符串“stringtoremove”。在我们的示例中,我们从变量origin/
中删除字符串$i
。
注意:另外,您也可以使用git checkout --track ...
执行此操作:
$ for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); do
git checkout --track $i; done
但我并不特别关心这种方法,因为它会在执行结账时将您切换到分支中。完成后,它将离开你创建的最后一个分支。
答案 4 :(得分:12)
你可以很容易地编写脚本,但我不知道它什么时候有价值。那些分支很快就会落后,你必须不断更新它们。
远程分支会自动保持最新状态,因此最简单的方法就是在您真正想要处理它的位置创建本地分支。
答案 5 :(得分:8)
for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done
答案 6 :(得分:6)
没有任何脚本(在空目录中):
$ git clone --bare repo_url .git
$ git config core.bare false
$ git checkout
之后,所有远程分支都将被视为本地分支。
答案 7 :(得分:4)
如果你想使用powershell,你的遥控器叫做origin。然后这就行了。
git fetch
git branch -r | %{$_ -replace " origin/"} | %{git branch --track $_ "origin/$_"}
答案 8 :(得分:3)
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do git branch --track ${branch##*/} $branch; done
使用此功能,您将不会收到以下警告:refname' origin / dev'含糊不清
答案 9 :(得分:3)
以下是@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
答案 10 :(得分:2)
与tjmcewan's answer相同但在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
答案 11 :(得分:2)
从git 2.23开始:
for branch in `git branch -r | grep origin/`; do git switch -t -C ${branch#origin/} $branch; git pull; done
-C
的{{1}}标志会创建或重置(如果已存在)。
答案 12 :(得分:1)
VonC 的解决方案可以通过更改 sed 进一步简化(我没有直接评论他的帖子的代表点):
for branch in $(git branch -r | sed 's,[^/]*/,,g'); do git switch $branch; done
把不是斜线的所有东西都替换到最后的斜线,剩下的分支名称适合本地使用;重复切换到同一个分支不是错误(它可能效率低下,但它可能比在管道中使用 grep 更有效:->)。
switch 命令足够智能,可以根据需要跟踪每个远程分支。
答案 13 :(得分:0)
如果您已经签出了一些分支并想要
您可以使用以下与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
答案 14 :(得分:0)
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和master的条目。
第3行:在本地检出时跟踪指定的远程分支。一个简单的awk用于避免'origin /'成为本地分支的后缀。
答案 15 :(得分:0)
使用bash, 如果您要签出所有分支机构:
for remote in `git branch -r`; do git checkout $(echo $remote | cut -d'/' -f 2); done
重要的是要注意,当您进行提取以关闭新的远程跟踪分支时,您不会自动拥有它们的本地可编辑副本。