使用Git 作为 Subversion 仓库的客户端

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/dahaohan/article/details/83545403

Git 与 Subversion

Git 和 Subversion两个大名鼎鼎的版本控制系统,有着各自的特点和长处。笔者更喜欢Git分布式去中心化不依赖网络的便捷和强大的本地分支管理,目前开源项目以及大量的商业项目都使用 Subversion 来管理源码。当代码仓库为SVN仓库而又想使用git时,恰好git svn工具可以满足您的需求。

Warning

在使用 git svn 的时候,你实际是在与 Subversion 交互,Git 比它要高级复杂的多。尽管可以在本地随意的进行分支和合并,最好还是通过衍合保持线性的提交历史,尽量避免类似与远程 Git 仓库动态交互这样的操作。
避免修改历史再重新推送的做法,也不要同时推送到并行的 Git 仓库来试图与其他 Git 用户合作。Subersion 只能保存单一的线性提交历史,一不小心就会被搞糊涂。合作团队中同时有人用 SVN 和 Git,一定要确保所有人都使用 SVN 服务来协作——这会让生活轻松很多。

Start

远程SVN仓库地址:

svn://svnbucket.com/****/svn_test

本地git svn clone

在这里插入图片描述
git svn clone svn仓库地址 -s可以将远程Subversion 仓库导入到一个本地的 Git 仓库中。-s 命令,它意味着标准布局(s 是 Standard layout 的首字母):Subversion 仓库遵循了基本的分支和标签命名法则(如上图trunk、tags、branches文件夹命名)。完整命令为:git svn clone svn仓库地址 -T trunk -b branches -t tags;若您的仓库命名与标准不一致请做出相应的改动。

若出现:Using higher level of URL: xxxxxx错误
使用git svn clone svn仓库 -s --no-minimize-url具体可参考:
https://stackoverflow.com/questions/1453416/git-svn-clone-checkouts-wrong-repo

向SVN仓库提交

在这里插入图片描述
在这里插入图片描述
可以看到本地git仓库初始完成之后,本地代码的管理完全基于git命令,只是向服务器仓库提交代码有变动使用git svn dcommit

拉取服务器最新代码

sit svn fetch 能获取最新的数据,git svn rebase 才会在获取之后在本地进行更新 。
在这里插入图片描述
在这里插入图片描述
事实上sit svn fetch类似git fetch会将远程仓库代码拉取到本地对应分支上:
在这里插入图片描述

需要牢记的一点是,Git 要求我们在推送之前先合并上游仓库中最新的内容,而 git svn 只要求存在冲突的时候才这样做。假如有人向一个文件推送了一些修改,这时你要向另一个文件推送一些修改,那么 dcommit 将正常工作。
众所周知SVN仓库只保持单一的线性提交历史,而不像git的commit历史可以有合并的历史“分叉”,所以使用git的本地分支尽可能使用rebase到主干master保持干净的线性历史对于svn dcommit来说是一个好的选择。

分支操作-创建新的 SVN 分支

git svn branch [your_branch_name] -m "message"命令可以在svn服务器上创建一个新的分支等价于svn copy trunk branches/your_branch_name
若出现:
在这里插入图片描述
git svn branch [your_branch_name] -m "test" --destination branches
详情参阅:https://stackoverflow.com/questions/2974016/git-svn-branching
在这里插入图片描述
上述命令仅仅创建svn分支并不会切换分支。

切换分支并提交到SVN指定分支

在这里插入图片描述
使用git svn dcommit命令需要注意:

Git 通过搜寻提交历史中 Subversion 分支的头部来决定 dcommit 的目的地——而它应该只有一个,那就是当前分支历史中最近一次包含 git-svn-id 的提交。

如果要提交到上面步骤在svn仓库创建的new_branch分支,则需要基于该remote svn 分支创建一个本地分支(上例子的hotfix),基于hotfix分支修改执行dcommit则提交到对应的svn new_branch分支。查看hotfix分支的log:
在这里插入图片描述
可以发现其最近的git-svn-id记录对应的svn仓库的new_branch分支,git svn执行dcommit命令以此提交更改到对应远程对应分支。git svn rebase命令也类似会拉取new_branch的最新修改更新到本地。

合并更改到主分支

若是基于svn new_branch分支做了修改提交,例如在本地的hotfix分支(对应svn的new_branch)分支开发完成了一个新模块想合并到git主分支并且提交到master对应的svn trunk分支该如何操作:
在这里插入图片描述
上述情况,new_branch已经有提交"change for test" 而 master分支还停留在"add img"提交处:

git checkout master //切换到主分支

//合并分支使用--squash将commit记录合并更新为一个新commit
git merge --squash hotfix  
git commit -am "merge new_branch branch features"
git svn dcommit

在这里插入图片描述
在这里插入图片描述
这样就可以把new_branch通过git svn合并提交到svn的trunk,可以看到略显麻烦并且在new_branch上的提交记录被隐藏了;当然也可以选择使用svn来执行svn 分支的合并然后再通过git svn rebase获取更新到本地git分支。不过本博文旨在尽量弱化svn操作,尽可能使用git svn来完成版本的管理。

Tag操作

git svn tag操作与git svn branch 操作类似:
在这里插入图片描述

分支/Tag的删除

由于git和svn分支的概念和管理上有很大差异,git svn命令没有提供删除svn 分支的方法。删除svn分支通过svn命令删除:

//1.删除远程svn仓库的分支
svn rm svn_branch_url -m 'messge:rm branch'
//2.删除本地git对应的追踪分支
git branch -D -r remote_name/the_branch
//3.删除本地git svn文件
rm -rf .git/svn/refs/remotes/your_branch

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

tag删除是类似的:

svn rm $URL/tags/the_tag_will_delete // step 1
git branch -D -r remote_name/tags/your_tag_name
rm -rf .git/svn/refs/remotes/remote_name/tags/your_tag_name

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/dahaohan/article/details/83545403
今日推荐