跟踪所有远程git分支作为本地分支
跟踪所有远程git分支作为本地分支
将单个远程分支追踪为本地分支非常简单。
$ 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
我已经谷歌过和阅读过文档,但目前还没有找到解决方法。
追踪所有远程git分支作为本地分支的原因是为了方便在本地管理和操作远程分支。通过追踪远程分支,我们可以在本地创建一个与远程分支对应的本地分支,并且可以直接在本地进行代码的修改、提交和推送等操作,而不需要每次都通过远程仓库进行操作。
在git版本1.9.1之后,可以使用以下bash脚本来追踪所有远程分支:
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之前,上述脚本会出现以下问题:
1. 所有创建的分支都会追踪主分支(master)。
2. 所有创建的本地分支名称都会以"origin/"作为前缀。
为了解决这些问题,可以使用以下bash脚本来追踪所有远程分支:
for remote in `git branch -r `; do git branch --track $remote; done
这段脚本与之前的脚本类似,只是省略了对远程分支名称的处理,从而避免了上述问题的发生。
如果希望更新追踪分支的代码(假设本地追踪分支没有进行过修改),可以使用以下bash脚本:
for remote in `git branch -r `; do git checkout $remote ; git pull; done
这段脚本通过遍历远程分支的列表,切换到每个远程分支并进行代码的拉取操作。
需要注意的是,在执行上述脚本时,可能会出现一些模棱两可的引用警告,但是git似乎更喜欢本地分支,因此可以忽略这些警告。
总结起来,追踪所有远程git分支作为本地分支的原因是为了在本地方便地管理和操作远程分支。通过使用适当的bash脚本,我们可以轻松地创建与远程分支对应的本地分支,并进行代码的更新和提交等操作。
追踪所有远程的git分支作为本地分支的问题出现的原因是想要将远程的git分支作为本地分支进行追踪。解决方法是使用for循环来创建追踪分支。
具体的解决方法如下:
1. 首先确认本地是否已经追踪了除了master之外的其他分支,可以使用git branch -l
或者git branch
命令来确认。
2. 使用以下一行命令来创建追踪分支:for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done
3. 确认追踪分支是否创建成功,可以使用git branch
命令来确认。
4. 如果需要删除追踪分支,可以使用git br -D
命令来删除分支。
5. 使用git br -vv
命令可以确认追踪分支的详细信息。
6. 如果不想使用for循环,可以使用git checkout --track
命令来创建追踪分支。
7. 针对Windows系统,需要根据具体情况进行相应的操作。
参考资料:
- 10.1. Manipulating Strings - Advanced Bash Scripting Guide
- 3.5 Git Branching - Remote Branches
这个方法在git版本2.3.2上测试通过。
跟踪所有远程git分支作为本地分支的问题出现的原因是:创建的所有分支的名称都以"origin/"开头。如果您只想要最后部分(最后一个/之后的部分)作为您的结果分支名称,请使用以下命令:for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done 这样做还有一个好处,就是不会给您带来任何关于模糊引用的警告。Git不会将"origin"添加到本地跟踪分支名称中。实际上,对我来说,它的行为与我在OSX 10.6.4上所说的完全一样,使用的是git 1.7.2.2(截至本评论时的最新稳定版本)。Otto甚至提到了模糊引用名称警告-如果"origin/"不是每个本地分支名称的一部分,这些警告就不需要存在。在运行Otto的命令后,这是'git branch'输出的结果:[master, origin/HEAD, origin/charts, origin/master, origin/production, origin/staging]。而我的命令是:[charts, master, production, staging]。 +1 这正是我所需要的东西。我很惊讶它并不是git的一个功能。所以现在我有了所有的git.git分支,我可以看看可能涉及的内容! +编辑:找到了解释的文章.gmane.org/gmane.comp.version-control.git/112575 我同意-这比当前"接受"答案更好。当git输出类似origin/HEAD -> origin/development这样的内容时,这个方法不起作用,因为>字符会传递给git checkout。 是的,伙计,如果您不使用master作为默认分支,您需要自定义它。然而,master是压倒性的惯例。而不是grep -v master,为什么不使用grep -v /HEAD?这似乎可以过滤掉默认分支,而无需自定义。不确定checkout是否是理想选择,特别是如果您有很多分支。我使用了这个答案和Otto的答案的组合:for branch in git branch -r | grep -v /HEAD; do git branch --track ${branch#origin/} $branch ; done