唐容 2016-02-19 15538浏览量
本篇文章是走进git时代系列之二,如何迁移到GIT的教程, 不了解GIT的同学可以先看系列一《走进git时代系列一》 你该怎么玩?
git svn clone -s svn-repository-url
git svn rebase
。 当同步SVN时出现冲突,需要手动修改冲突,git add 添加后继续rebase: git svn rebase --continue
git svn dcommit
尽量保持git代码库的线性特征。比如在new_branch分支中,先和master做rebase,再合并到master分支中:
git svn clone -s http://code.taobao.org/svn/QLExpress/
, 为什么要加-s , 因为这个仓库是按照标准的tags、trunk、branches结构划分的,则git svn会将对应的分支、标签识别存放到git的结构中。 如果不加-s,不会将tags、branch按照git的结构进行划分 。git svn clone -s -r$REVNUMBER:HEAD http://svnurl/yourrepo
来检出最后的几个版本。 举个栗子:svn log http://svnurl/yourrepo| tail -4 | head -1
获取当前仓库的起始Version,假设是r10, 那我们如果要检出所有版本,命令为git svn clone -s -r10:HEAD http://svnurl/yourrepo
svn info http://svnurl/yourrepo | grep Revision
获取最新的SVN版本号,假设我们要最后10个版本,则命令为 git svn clone -s --prefix=svn/ -r90:HEAD http://svnurl/yourrepo
, 示例图如下 :git show-ref
可以看到有master这个本地分支,同时有remote 分支trunk , 1.4.1, 2.1.0 等, 通过Git Version 发现trunk 和 Master分支的版本是一样的, 其他几个分支和SVN客户端branches 目录下的结构是一样的。 说明 git svn 将svn的主干和其他分支 转换为了git的 master 和其他branch 。git svn clone http://svnurl/yourrepo -T trunk -b branches -t release
这里制定了release是一个标签集。 git svn clone http://svnurl/yourrepo/project1 -T rpm -b branches -t release
这里指定了svn库中的rpm目录是主干、branches目录是分支集,release目录是标签集,而project1下的其他目录会被忽视。cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
rm -Rf .git/refs/remotes/tags
cp -Rf .git/refs/remotes/* .git/refs/heads/
rm -Rf .git/refs/remotes
ssh-keygen
命令 一路回车后创建, 然后将~/.ssh/id_rsa.pub的内容粘贴到下图中:git config --global user.name "tangrong.lx"
git config --global user.email "tangrong.lx@taobao.com"
git remote add origin git@code.aliyun.com:tangrong111/QLExpress.git
, 这些命令在云code 中创建代码库后页面里有提示,可以直接复制,当然我这个是从svn 倒过来的代码库,只需要这一个远程地址即可,不需要git 初始化之类的操作:git status
查看一下,避免本地有其他不小心的修改, 然后再执行 git push origin --all
, 就可以鉴证这伟大的时刻了:git log
可以看到每一个commit 都有记录 对应的svn版本地址, 而且svn的 commit log 也被转换为了 git的commit log, 是不是很神奇。 这时,我们刷新一下https://code.aliyun.com/tangrong111/QLExpress 这个页面,代码库已经被推送上来,并记录了大小,分支,提交次数等信息:git branch -m svn
git remote add origin git@github.com:yourname/yourrepo.git
git checkout master
那么本地svn分支对应svn的远程仓库,本地master分支对应git的远程仓库
你可以继续创建本地分支进行开发, 当要提交到远程git时,切换到master分支下, 合并你的分支, git push 到git远端上
如果代码要更新到svn上:
git checkout svn
git merge master
git svn dcommit
修改本地代码后, 通过 git add/commit
提交到本地git库
定期rebase 获取svn, 定期 dcommit 提交到svn库
Just redo this tripple:
git svn fetch
git svn rebase
git svn dcommit 如果要给svn库建分支:
git svn branch xxxxx 如果要给svn打tag :
git svn tag 0.1
假设其他同学也在同时开发,已经提交了新版本到SVN中, 当你git svn dcommit 的时候提示本地文件已经过期
你通过 git svn rebase 获取SVN的最新文件版本, 导致文件出现冲突
不过这个时候SVN的版本信息已经添加到本地的git库里, 通过git log 可以看到
那么,打开冲突文件,修改代码,解决冲突。 执行
git rebase --continue
提示You must edit all merge conflicts and then mark them as resolved using git add 执行 git add xxxx 后,再次执行
git rebase --continue 提示'Applying: xxxxxxxxx'
此时git的版本成功加入到本地版本库, 可以通过git log 查看。
执行 git svn dcommit
把解决后的文件同步到SVN远程库中,到此算是完成一次冲突解决。
《玩转云Code最佳实践》
吧 !版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
集结各类场景实战经验,助你开发运维畅行无忧