将代码从 SVN 迁移至 Git 时, 若不关注 SVN 的历史提交记录, 则直接将一份源代码提交至远端 Git 仓库即可; 但对于大多数项目, 历史提交则是对团队比较宝贵的记录, 若要导出 SVN 的历史记录, 则需要借助 Git 与 SVN 是双向桥接的特性, 即 Git SVN 1 , 它允许你使用 Git 作为连接到 SVN 有效的客户端, 这样你可以使用 Git 所有本地的功能然后如同正在本地使用 SVN 一样推送到 SVN 服务器.
它可以快速的帮你从指定 SVN 中克隆 (默认包含所有 tags,branches), 其中 --authors-file 可以帮助你解决 Git 与 SVN 的兼容问题(即导入后用户邮箱为不匹配), 只需要按如下格式添加 SVN 的用户及邮箱至指定文件(e.g. authors.txt) 即可, 例如:
当然, 你也可以添加指定的命令来完成你的拉取过程, 例如 :
--revision 1:HEAD 指定 revision 的范围
--ignore-paths="^[^/]+/(?:branches|tags)" 忽略所有 branch 与 tags 的拉取, 更多命令可以参照 Git SVN 1 中内容.
加速你的迁移
Git SVN clone 的执行速度取决于你 SVN 项目的规模以及服役时间的长短, 一般项目可以在几十分钟内搞定, 但如果是较大的项目, fetch 到所有的 commits 可能需要几小时甚至是几天的时间, 这无疑会对迁移会造成一定困扰; 在 SVN 迁移至 Git 的过程中, 往往并不是所有的 tag 和 branch 都是我们需要的, 这里也为大家介绍几种踩过坑的方式:
一, 直接获取某一分支
SVN 路径直接指定分支即可, 这样最为简单粗暴, 好处是拉取后 branch 直接作为 master 并保存了所有从这个分支开始的提交记录, 缺点是 SVN 中其他分支的信息全部丢失.
二, 通过修改 Git 配置文件
我们之前提到的 Git SVN clone 命令, 其实本质执行了 (Git SVN init 和 fetch) 两个步骤, 在 Git SVN init 的过程中, 创建了本地仓库并建立了与 SVN 的映射关系, 然后通过 Git SVN fetch 拉取 SVN 的 commits, 我们可以 Git SVN init 建立映射后, 通过更改 $GIT_DIR/config 文件中 SVN 的配置, 达到缩小分支范围的目的, e.g. 如下配置则将分支范围限定在 red 和 green 分支, tags 范围则限制在 1.0 和 2.0:
更多参考配置可参考:
Git SVN config configuration 2 .
上传至远端仓库
在将 SVN 克隆至本地 Git 仓库时, 你会发现本地并未自动创建 SVN 中的 branch 和 tags, 而 SVN 的 branches 和 tags 显示在了 Git 的远程分支中, 如下图所示, 究其原理, 传送门 3 给大家:
在 SVN 中, 如果你的 branch 或 tag 只做发布用, 其对应的记录信息对于团队并不重要的话, 直接添加远程 Git 仓库并 push 到 master 即可.
但若 branch 或 tag 中的信息比较重要, 你则需要将分支 checkout 至本地, 并 push 到远端, 以免信息丢失; 又如果你的团队出于某种原因, 已经很久没有在 trunk 上开发, 而一直在 branch 上开发的话, 你又不想在迁移后, 存在若干个 branch, 也尝试直接将 branch(事先 checkout 到本地)覆盖到 master.
Tips:
1, 如果单次 push 过程中有超过 500M 的大文件, 推荐走 LFS 的方式上传即可完美解决.
像 SVN 一样的代码提交检查(甚至更好)
相信部分团队会利用 SVN 强制关联功能对于 check-in 会有一些强制约束(例如, 不关联需求单或 bug 单信息则无法提交代码), 而针对于本地的 commits code 平台却难监管, 本地提交检测, Git hook 是一个不错的选择, 它提供了各个不同阶段的 hook, 例如针对 commit 操作有如下 hook(更多的请参考 Git-hook 4 ):
而本地 hook 都被存放本地 $GIT_DIR 中(即. Git/hooks), 同时也提供了一些例子(shell+perl), 当然它也支持 python 和 Ruby, 接下来以检查是否与 tapd 关联为例, 以一些 python 代码片段来描述下如何编写本地 hook:
1. 在. Git/hook 目录中, 将 commit-msg.sample 重命名为 commit-msg, 并更改如下内容:
其中 $1 则为提交信息的临时文件路径.
2. 在. Git/hook 目录中创建 commit-msg.py, python 脚本中编写对应的验证逻辑, 例如下:
若提交不符合规范, 则直接提示并本地打回.
依托于本地的 hook, 我们甚至可以建更多的代码检查放在本地提交代码时, 而不是依托各种平台的较长反馈链, 例如我们团队, 就会在本地提交前运行 cpplint 并将错误提示给 commiter.
文章内附链接如下:
1, Git SVN 官网:
https://git-scm.com/docs/git-svn
2, Git SVN config configuration 官网:
https://git-scm.com/docs/git-svn#_configuration
3, 传送门 官网 :
https://git-scm.com/book/zh/v2/起步-Git-基础
4, Git-hook 官网 :
https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks
来源: http://www.tuicool.com/articles/MVnMNf6