欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 15:26:04
...
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 co -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官方文档

相关标签: git svn svn分支

上一篇: Git项目提交到SVN

下一篇: Hash表