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

本文以 http://svn.code.sf.net/p/mjpg-streamer/code/ 仓库为例

克隆svn仓库

git svn clone http://svn.code.sf.net/p/mjpg-streamer/code/ --no-metadata -s mjpg-streamer

参数说明

参数说明
-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.
mjpg-streamer表示git项目名称

批量更新log中的name和email

sobird@sobird mjpg-streamer (master) $ git log
commit bfec699a96a787d8606aacf45e1b92d43d5d91ff (HEAD -> master, git-svn)
Author: martonmiklos <martonmiklos@a8dad676-403b-0410-b964-c43bdf40fe89>
Date:   Sun Oct 27 11:46:45 2013 +0000

    - Deleted QtCreator project files
    Solving BUG #31 (thank you  Andreas Doersam!):
            - Fixed memory leak in exec_cgi (buffer was not been released)
            - Added HTTP 200 OK header
            - CGI output now is copied with correct size chunk(s)

以上log中Author的name为martonmiklos,email为martonmiklos@a8dad676-403b-0410-b964-c43bdf40fe89,可能并不是github对应的name和email,那么通过下面的一行命令即可批量更新。

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='sobird'; GIT_AUTHOR_EMAIL='i@sobird.me'; GIT_COMMITTER_NAME='sobird'; GIT_COMMITTER_EMAIL='i@sobird.me';" HEAD

整理分支

在推送github之前,需要整理一下分之和标签。

移动标签,把它们从奇怪的远程分支变成实际的标签,然后把剩下的分支移动到本地。

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

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

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

现在所有的旧分支都变成真正的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:sobird/test.git
git push -u origin master

参考资料