svn迁移git相关操作说明

工作上很久不用svn了,主要在用git作为代码的版本控制,本文主要整理了之前将svn版本库迁移到git版本的过程,用来备忘。

克隆svn仓库

http://svn.sobird.me/wordpress/为例

cd ~
git svn clone http://svn.sobird.me/wordpress/ -s --no-metadata wordpress

参数说明

-s 告诉 Git 该 Subversion 仓库遵循了基本的分支和标签命名法则,也就是标准布局。
如果你的主干(trunk,相当于非分布式版本控制里的master分支,代表开发的主线),分支(branches)或者标签(tags)以不同的方式命名,则应做出相应改变。
-s参数其实是-T trunk -b branches -t tags的缩写,这些参数告诉git这些文件夹与git分支、tag、master的对应关系
–no-metadata 表示阻止git导出SVN包含的一些无用信息
–prefix –prefix=svn/ 表示给svn的所有remote名称增加了一个前缀svn,这样比较统一,而且可以防止warning: refname ‘xxx’ is ambiguous.
wordpress 表示git项目名称

批量更新log中的name和email

MacBookPro:wordpress sobird$ git log
commit 2cc006cf0044080bc6d0530cfa86ef5b0f869de7
Author: sobird <sobird@03cbcded-9dd1-4c32-97f2-e9e95ae9a827>
Date:   Thu Jan 8 03:44:21 2015 +0000

    添加博客favicon.ico图片文件

    git-svn-id: http://svn.sobird.me/wordpress/trunk@48 03cbcded-9dd1-4c32-97f2-e9e95ae9a827

commit 70531fe2f240430a651bd7bdfd954bafcb562769

以上log中Author的name为sobird,email为sobird@03cbcded-9dd1-4c32-97f2-e9e95ae9a827,可能并不是github对应的name和email,那么通过下面的一行命令即可批量更新。

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='sobird'; GIT_AUTHOR_EMAIL='crossyou2009@gmail.com'; GIT_COMMITTER_NAME='sobird'; GIT_COMMITTER_EMAIL='crossyou2009@gmail.com';" HEAD

整理分支

在推送github之前,需要整理一下分之和标签.
移动标签,把它们从奇怪的远程分支变成实际的标签,然后把剩下的分支移动到本地。

cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
rm -Rf .git/refs/remotes/tags

该命令将原本以tag/ 开头的远程分支的索引变成真正的(轻巧的)标签。接下来,把refs/remotes 下面剩下的索引变成本地分支:

cp -Rf .git/refs/remotes/* .git/refs/heads/
rm -Rf .git/refs/remotes

现在所有的旧分支都变成真正的Git 分支,所有的旧标签也变成真正的Git 标签。最后,一项工作就是把新建的Git服务器添加为远程服务器并且向它推送。为了让所有的分支和标签都得到上传,我们使用这条命令:

git push origin –all

推送所有tag到github

git push origin --tags

git ignores

git svn show-ignore > .git/info/exclude

推送github远程仓库

git remote add origin git@github.com:yangjunlong/test.git
git push -u origin master

参考资料

SVN迁移到Git的过程(+ 一些技巧)
git filter-branch使用方法

这篇文章目前没有评论

Leave a Reply

(必填项)

(必填项)

(可选)