工作上很久不用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
这篇文章目前没有评论