git svn用git提交到远端svn仓库,包含只拥有某个分支权限的情况

git svn

针对远端使用svn版本控制工具,本地想用git管理,但个人svn账号只有svn的某个分支的权限,没有trunk等其他权限的情况的时候,可通过如下步骤实现通过git管理本地代码以及提交到远端svn仓库

依赖工具:

git svn,安装git时基本已附带git svn 工具,可通过以下命令若没有,请自行安装

git svn --v
# 若显示git svn 版本号,则说明已经安装
git-svn version 2.17.1 (svn 1.9.4)

适用场景:

  1. 远端用svn管理,本地想用git管理,需要通过git提交到远端svn仓库
  2. 有svn仓库权限,或者只有svn某分支的读写权限的时候

git svn 大致使用流程:

  1. 拉取远端工程到本地 git svn clone
  2. 配置远端提交分支与本地分支的映射关系git config
  3. 拉取指定分支到本地指定分支git svn fetch
  4. 本地修改提交操作等同git,git add,git commit
  5. 定期拉取远端更新到本地git svn rebase
  6. 若有冲突解决冲突操作等同git解决冲突
  7. 推送本地已提交分支到远端对应分支 git svn dcommit

具体操作如下:

<name>表示需替换的内容,[param]表示可缺省的配置
1. 拉取远端工程到本地 
# 若有svn仓库权限可直接拉取svn仓库,若只有某个分支的权限,则不能拉取仓库,只能拉取指定的分支,即有权限的分支
git svn clone [-r开始版本号:结束版本号] <svn地址/svn分支地址> [本地文件夹名字] [-s] [--prefix=svn/] 
## 参数说明:
 -r表示拉取指定版本开始的代码
 本地文件夹的名字默认为svn分支的名字
 -s表示遵循远端svn遵循标准svn分支规范,拥有trunk,branches等分支,其实就是-T trunk -b branches -t tags的缩写,通过这些参数告诉git这些文件夹与git分支、tag、master的对应关系
 --prefix=svn/ 给svn的所有remote名称增加了一个前缀svn,建议这样做,统一清晰,便于管理
# 个别示例场景如下:
git svn clone <svn_url> demo # 默认拉取全部版本到本地的demo文件夹
# 如果远端仓库版本较多,速度比较慢,可选择只拉取指定版本的代码,例如远端的版本号为100,自己只需拉取90以后的版本,其中head表示最新版本
# 示例:
git svn clone -r90:100 <svn_url> demo
git svn clone -r90:head <svn_url> demo 
2. 本地已有代码,开始配置本地对应的分支信息,若拥有仓库权限,直接拉取的仓库,可跳过这一步,也可手动去拉取指定svn分支代码,步骤如下:
git config --add svn-remote.<远程分支名称>.url <svn地址,要包含具体分支路径>
git config --add svn-remote.<远程分支名称>.fetch :refs/remotes/<远程分支名称>
# 示例:
git config --add svn-remote.svn/<svn_branch_name>.url <svn_url_branch>
git config --add svn-remote.svn/<svn_branch_name>.fetch :refs/remotes/svn/<svn_branch_name>
# 此处的“远程分支名称”可以随意填写,只要这三个保持一致即可。建议都给他们增加svn/前缀,方便管理,与上面clone时的--prefix=svn/类似。
3. 新建本地分支,与svn对应
git svn fetch <远程分支名称> 获取svn仓库该分支的代码
# 示例:
git svn fetch svn/<svn_branch_name>
# 此步骤执行完以后可看到本地的分支信息,执行git branch -a,可看到:
* master
 <svn_branch_name>
 remotes/git-svn
 remotes/svn/<svn_branch_name>
4. 检出并切换分支到指定分支
git checkout -b <本地分支名> <远程分支名称>
# 示例:
git checkout -b <svn_branch_name> svn/<svn_branch_name>
5. 本地修改,提交代码,操作等同git操作,完全一样
git add . 
git commit -m "message"
6. 拉取远端更新到本地,这里通过rebase拉取
git svn rebase 
7. 若有冲突,解决方法等同git,首先解决冲突,然后执行如下命令
git add . 
git rebase --continue 
8. 冲突解决之后,提交到远程svn仓库
git svn dcommit
# 附从远端拉取项目或拉取新分支项目时的操作步骤:
##第一次拉取项目:
git svn clone <svn 分支地址> [本地文件夹名字]
##在已有git-svn项目上创建新分支,例如拉取项目demo的分支demo_V1.0.0代码:
git config --add svn-remote.svn/demo_V1.0.0.url https://svn_url/branches/demo_V1.0.0
git config --add svn-remote.svn/demo_V1.0.0.fetch :refs/remotes/svn/demo_V1.0.0
git svn fetch svn/demo_V1.0.0
git checkout -b demo_V1.0.0 svn/demo_V1.0.0

Git-Svn 总结

git svn 工具在当前不得不使用 Svn 服务器或者开发环境要求使用 Svn 服务器的时候格外有用。把它当成一个简易版的Git即可,不过,你还是有可能使用过程中碰到一些麻烦。为了避免麻烦,试着遵守如下守则:

  1. 保持一个不包含由 git merge 生成的 commit 的线性提交历史。将在主线分支外进行的开发通通衍合回主线;避免直接合并
  2. 不要单独建立和使用一个 Git 服务器来搞合作。可以为了加速新开发者的克隆进程建立一个,但是不要向它提供任何不包含 git-svn-id 条目的内容。甚至可以添加一个 pre-receive 挂钩来在每一个提交信息中查找 git-svn-id 并拒绝提交那些不包含它的 commit
  3. 在项目代码管理方面,还是建议尽量使用Git,了解Git的使用思想,对自己的软件开发,开发效率也能有不错的提升,毕竟git svn的使用也只是一个暂时性的过渡工具

参考文章: git官方文档

了解更多
举报
评论 0