前言
对于git,它是版本控制的不二人选。分散式的管理方式为人所喜欢,给人以方便。
本文立足实际案例,可能这个案例对于应用开发的技术人员不是很常见,对于运维人员应当是必须的知识。如果你既是技术又是运维,那么恭喜你,你离大牛不远了

实际案例
今天刚哥交给我一个任务:把项目集合(a,b,c,d,e,f每个都是一个项目应用)从我们部门的git远程库迁移到公司级别的远程库上。
开始我以为很简单:就像本地建个项目,然后提交到github上呗。后来仔细一想,不对啊,我的任务需要我把这些项目的历史记录都要同步到新的远程库B上,包括提交历史,分支,tags。提交历史好办,直接提交就可以了,但是分支和tags就难办了,每个项目都有那么多的分支、那么多的tags,我如果要一个个的add、commit、push,这样会疯的。
假如,项目a有本地分支和tag:
a-features-0.0.1
a-features-0.0.2
a-features-0.0.3
a-features-0.0.4
a-features-0.0.5
master
tag:
a-features-0.0.1
a-features-0.0.2
a-features-0.0.3
如果冒然开始操作,会是这样:
[test@yy]$ git checkout master
[test@yy]$ git remote add yy remote-rep-B.git
[test@yy]$ git push yy master
[test@yy]$ git checkout a-features-0.0.1
[test@yy]$ git remote add yy remote-rep-B.git
[test@yy]$ git push yy a-features-0.0.1
这样需要5次反复操作才能完成,但是想想还有tag呢,还有其他多个项目呢,每个项目又有那么多的分支和tag呢。怎么办?所以,这样做效率很低下,而且容易出错,a-features-0.0.1提到a-features-0.0.2这样的提错分支就麻烦了。
带着我的想法,在google上发现了惊喜,上代码:
终端中输入下列命令
[test@yy]$ git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t' #配置命令:创建所有远程分支对应的本地分支,起了别名
[test@yy]$ git clone OLD_REPO_URL #从老的远程库克隆项目到本地
[test@yy]$ cd new-cloned-project #进入项目git中
[test@yy]$ git clone-branches #运行刚才配置的命令别名
[test@yy]$ git remote add newrepo NEW_REPO_URL #创建新的远程库
[test@yy]$ git push --all newrepo #把所有本地分支提交到新远程库的对应的远程分支上
[test@yy]$ git push --tags newrepo #把原来的所有tag提交到新远程库上
通过以上的命令,一次成功,所有的项目的所有的分支、tag只需一次都导入到了新的remote project。可以想象工作效率的提升是多少,指数级的高效率。
功能完事了,这件事同时给了我们一个通用的启示和技巧:不要着急写代码,敲键盘。先全局思考,脑子里过一遍,看看你要这么做会不会产生问题,产生什么问题,怎么解决这个问题。这样,相信你最终的操作就很完善了
博客新地址:yaoyuanyy.github.io