最通俗易懂的IDEA使用svn 和eclipse 使用svn
缘起
前段时间跳槽到了国企,和面试官吹牛吹了好久,在家休整了几天,也没啥消息,就在昨天老大突然找了我,激动的说就需要我这样的人才 小刘,心里默默的说了句,卧槽! 正在我高兴之际,面试官大哥接着说,公司很多项目都是svn 很多的
EJB项目和Spring项目
emmm..... 于是今天今天就整了这篇文章,总结下,和自己理解,花了一周写出这篇文章大家分享一下
SVN 介绍
Apache Subversion 通常被缩写成 SVN,是一个开放源代码的版本控制系统,Subversion 在 2000 年由 CollabNet Inc 开发,现在发展成为 Apache 软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。
SVN相对于的RCS、CVS,采用了分支管理系统,它的设计目标就是取代CVS。互联网上免费的版本控制服务多基于Subversion。
简单点说吧
Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。这些数据放置在一个中央资料档案库 (repository) 中。这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史
谈到 版本控制大家最先想到的就是git了,这里补两句svn和git的区别
概念
repository(源代码库):源代码统一存放的地方
Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份
Commit(提交):当你已经修改了代码,你就需要Commit到repository
Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更
GIT和svn 的区别
GIT是分布式的,SVN不是
这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。如果你能理解这个概念,那么你就已经上手一半了。需要做一点声明,GIT并不是目前第一个或唯一的分布式版本控制系统。在这之前还有一些系统,例如Bitkeeper, Mercurial等,也是运行在分布式模式上的。但GIT在这方面做的更好,而且有更多强大的功能特征。
GIT跟SVN一样有自己的 集中式
版本库或服务器。但GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,就像在飞机上,地下室,电梯里等,你仍然能够提 交文件,查看历史版本记录,创建项目分支,等。对一些人来说,这好像没多大用处,但当你突然遇到没有网络的环境时,这个将解决你的大麻烦。
同样,这种分布式的操作模式对于开源软件社区的开发来说也是个巨大的恩赐,你不必再像以前那样做出补丁包,通过email方式发送出去,你只需要创建一个分支,向项目团队发送一个推请求。 这能让你的代码保持最新,而且不会在传输过程中丢失。GitHub.com就是一个这样的优秀案例。
有些谣言传出来说subversion将来的版本也会基于分布式模式。但至少目前还看不出来。
GIT把内容按元数据方式存储,而SVN是按文件:
所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn
, .cvs
等的文件夹里。如果你把.git目录的 体积大小跟 .svn
比较,你会发现它们差距很大。因为, .git
目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分 支,版本记录等。
GIT分支和SVN的分支不同:
分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。感谢Ben同学指出这个特征。所以,经常会发生有些分支被遗漏的情况。
然而,处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。
4.GIT没有一个全局的版本号,而SVN有:
目前为止这是跟SVN相比GIT缺少的最大的一个特征。你也知道,SVN的版本号实际是任何一个相应时间的源代 码快照。我认为它是从CVS进化到SVN的最大的一个突破。因为GIT和SVN从概念上就不同,我不知道GIT里是什么特征与之对应。如果你有任何的线 索,请在评论里奉献出来与大家共享。
更新:有些读者指出,我们可以使用GIT的SHA-1来唯一的标识一个代码快照。这个并不能完全的代替SVN里容易阅读的数字版本号。但,用途应该是相同的。
5.GIT的内容完整性要优于SVN:
GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
6)Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网;
7)SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交,这样其实挺麻烦的,有好几次同事没有先Updata,就Commit了,发生了一些错误,耽误了大家时间,Git可能这种情况会少些。
Git只关心文件数据的整体是否发生变化,而SVN这类版本控制系统则只关心文件内容的具体差异
SVN 生命周期
创建版本库 版本库相当于一个集中的空间,用于存放开发者所有的工作成果。版本库不仅能存放文件,还包括了每次修改的历史,即每个文件的变动历史。
Create 操作是用来创建一个新的版本库。大多数情况下这个操作只会执行一次。当你创建一个新的版本库的时候,你的版本控制系统会让你提供一些信息来标识版本库,例如创建的位置和版本库的名字。
检出 Checkout 操作是用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到版本库中。
更新 顾名思义,update 操作是用来更新版本库的。这个操作将工作副本与版本库进行同步。由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。
让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。
此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。
执行变更 当检出之后,你就可以做很多操作来执行变更。编辑是最常用的操作。你可以编辑已存在的文件,例如进行文件的添加/删除操作。
你可以添加文件/目录。但是这些添加的文件目录不会立刻成为版本库的一部分,而是被添加进待变更列表中,直到执行了 commit 操作后才会成为版本库的一部分。
同样地你可以删除文件/目录。删除操作立刻将文件从工作副本中删除掉,但该文件的实际删除只是被添加到了待变更列表中,直到执行了 commit 操作后才会真正删除。
Rename 操作可以更改文件/目录的名字。"移动"操作用来将文件/目录从一处移动到版本库中的另一处。
复查变化 当你检出工作副本或者更新工作副本后,你的工作副本就跟版本库完全同步了。但是当你对工作副本进行一些修改之后,你的工作副本会比版本库要新。在 commit 操作之前复查下你的修改是一个很好的习惯。
Status 操作列出了工作副本中所进行的变动。正如我们之前提到的,你对工作副本的任何改动都会成为待变更列表的一部分。Status 操作就是用来查看这个待变更列表。
Status 操作只是提供了一个变动列表,但并不提供变动的详细信息。你可以用 diff 操作来查看这些变动的详细信息。
修复错误 我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候 revert 操作将会帮助你。
Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。
解决冲突 合并的时候可能会发生冲突。Merge 操作会自动处理可以安全合并的东西。其它的会被当做冲突。例如,"hello.c" 文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve 操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。
提交更改 Commit 操作是用来将更改从工作副本到版本库。这个操作会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。
在提交之前,你必须将文件/目录添加到待变更列表中。列表中记录了将会被提交的改动。当提交的时候,我们通常会提供一个注释来说明为什么会进行这些改动。这个注释也会成为版本库历史记录的一部分。Commit 是一个原子操作,也就是说要么完全提交成功,要么失败回滚。用户不会看到成功提交一半的情况。
上面这些东西,大家下理论就行了
SVN 命令行下载
1、准备svn的安装文件
别问为什么,前辈经验,选第一个就对了
然后下一步,查看一下安装目录 把bin目录放在 path 中这样全局,都可以访问了
此电脑右键点击属性
最后把bin目录丢进来
Ok了!
常用命令
创建版本库
svnadmin create /opt/svn/runoob
使用命令svnserve启动服务
svnserve -d -r 目录 --listen-port 端口号
```
+ ` -r`: 配置方式决定了版本库访问方式。
+ `--listen-port`: 指定SVN监听端口,不加此参数,SVN默认监听3690
使用命令svnserve启动服务
+ 检出操作
` 前面是自己仓库的路径`
svn checkout svn://192.168.0.1/quanzhanxiaoliu--username=user01 ``` 其他操作大家参考官网,这里不详解 :
https://easydoc.top/s/78711005/uSJD1CDg/33195524
下载SVN客户端
一般我们几乎不会直接用命令行操作,而是使用 SVN 客户端TortoiseSVN 进行操作svn TortoiseSVN又有一个名字叫做小乌龟,因为官网的标志像极了一个乌龟 接下来我们就来下载小乌龟
下载之后直接安装就好了,但是要注意这里,选择安装所有的命令行客户端工具,默认是不安装的,如果不安装,svn中的bin目录下就会没有svn.exe,这个待会会用到,所以一点要注意哦。(都是坑啊)
这里要特别声明一下——SVN客户端 不是指一个桌面应用程序,而是集成到系统的右键菜单中的插件。因此使用客户端向资源库下载项目资源、提交项目资源等都是通过右键菜单来完成的。
在桌面空白处右键: 然后安装语言包 一直下一步就好了
什么!你说你没有代码仓库!
去SVNBuket 创建一个 SVN 仓库 https://svnbucket.com/#/login 在这里注册并创建一个仓库
SVNButeket就相当于Github
右键 勾上我们需要的文件 就上来了 点击提交历史,可以看到记录(当然我没写注释) 当然也可以更新,每次提交之前进行一次更新,这是一个很好的习惯 避免冲突, 注意·:最好先更新,在修改,最后在提交
还可以查看日志
可以双击查看差异
撤销和恢复
如果你写代码发现写错了,你想要撤销,那就,可以点击还原
或者你可以先看一些改了哪里,有没有改错,然后在还原
如果你代码已经修改了,并且提交了,这个时候,你发现你改错了,想要恢复恢复回来
点击日志 复原此版本做出的修改,点击还原
又或者,你想回到某个版本,发现这几版写的代码都不太行 点击复原道此版本
忽略文件
有的时候,你并不想全部提交,而是想忽略某个文件夹,可以点击右键
同样的方式,取消忽略 还有一种情况就是, 某一个文件夹里的 文件你不想忽略 ,可以先把单独的文件不提交 每一个文件加入,都必须
发生冲突
发送代码冲突,是我们经常会遇到的 一般可能是 多个人修改了同一个文件的同一行,发生的冲突或者无法进行合并的二进制文件
解决:使用他的,或者我的代码,因为是同一个人修改一个地方 另外一种叫编辑冲突,自己手动合并 自己去选择修改那个
二进制图片也是一样的方式
分支
正常的 svn 目录结构
当然也在创建svn Bucket 仓库的时候 勾上可以自己自动创建
trunk : 主干 :存放开发中的文件,
tag : 标记 :
+ branches 分支 : 开发完之后存放到 branches里面
我们在trunk([文件]然后更新,某天要上线了,我们可以重新开一个线上版本,选中trunk 然后右键 选择分支/标记
选择之后,在线上的 branches后面跟上你的新分支名
然后在更新一下branch ,就会发现多了一个刚刚线上创建的
分支以后会越来越多,所以可以单独checkout 一下 右键 重新克隆到本地
然后单独开发 ,如果说线上分支的修改了,本地可以直接合并到主干
切换分支
本地右键选择分支/标记,
选择一个远程分支,自己自定义 然后在点击切换
就会切换到你的指定版本
IDEA使用SVN
这个版本选默认就对了 询问你是否要导入 svn
懒得截了,直接用别人的 ,不要喷我,我这叫面向对象思维,别人已经写好的功能,直接调 就好 相当于
导入jar包
Imageimage=newImage
【以下图片来源:不甘于平凡的溃败 】
这个就是打开之后的,截的全图的效果。具体注释我都写在截图上了。 因为这个mavne项目,导出之后,编辑器会自动判断一下,他要是发现pom.xml文件的话,他就会这么提示你,按我图上的操作就OK啦。
继续吧,图上写的应该比较详细啦。 这个就是刚刚导出项目之后,这个版本控制的初始情况。虽然我后面也会说,你可以依我图操作一下,看着干净舒心。
要是下面有重复讲解的地方,还请见谅啊。
经过这么操作,这就干净啦。继续看图ing。 这个就是所有提交记录的列表的地方。
刷新出来的效果。
绿色的 叫 Commit changes 提交项目上所有变化文件。点击这个按钮不会立马提交所有文件,而是先弹出一个被修改文件的一个汇总框,具体操作下面会有图片进行专门介绍。
蓝色的叫 Update Project 更新项目。
这俩就是撤回和历史
在编辑器开始常规操作
和之前的操作一样的,右键 checkout,选择本地目录即可 右键查看提交的历史
和 git 不同的是 ,他是 所有所谓的暂存的概念的 ,直接提交
第二个功能就是改代码上传更新解决冲突中等操作
在 1.html 改了 111 在 2.html 改了2222 在 LocalChange 中告诉我们已经改动
这里穿插一个小功能,如果我们有一些文件我们并不关心他是否改变,我们就可以再新建一个changelist,我这里叫new changelist可以把我们不关心的文件放入到这里,这样方便我们观察我们关心的文件,比如如果是个大的工程,很多class文件我们并不关心,就可以这样做
我们开始提交我们修改过的代码,一般的顺序是我们先update,如果update的时候没有任何提示,就可以顺利提交,如果有冲突,他就会告诉我们那些文件有冲突,需要解决,这里我认为不如eclipse中的svn直观
额,,,,,, 好像没冲突,算了我自己制造把
下面我们做一个有冲突的例子,我在这别处用其它用户已经改了同一行的代码
所以按刚才的方法更新的时候就会告诉我们有冲突
点合并就出现了下面的这个界面,这个感觉比eclipse好一点,这个中间的就是我们想要的最终结果,两边就是两个冲突的版本,根据需要解决好冲突,点apply意思是中间的已经就是我们最终想要的结果。然后提交就可以了
最终结果
下面是一些可能有用的功能,查看某个版本更改了那些文件
左键之后有可以有一些操作,比如和本地和某一个历史版本比较等
也可以把某一个文件还原到某一个历史版本,head是最新的,可以点上面的选择版本
这里可以看本地的历史的版本 这样看各个版本改了哪些文件很方便
Ok 了,常用的操作就这么多,到时候有啥问题,可以找我
Eclipse使用SVN
1. 在Eclipse中下载svn插件subclipse[简称SVN】
下载就对了,下载好之后
如何判断subclipse是否已经安装成功呢?直接点击 【window】-【show view】-【other...】
,在弹出的对话框中输入“SVN”,如果出现以下内容,则说明安装成功!
2. 在eclipse中连接代码仓库
首先双击打开“SVN资源库”( 【window】-【show view】-【other...】-【SVN】
-“SVN资源库”),然后右键新建资源库位置 这里需要我们输入svn 项目的 URL,所以我们先创建项目使用SVN管理,再将项目的URL复制到这里来
3. 创建项目使用svn管理
在SVN服务器的安装目录下进入bin文件夹,双击VisualAVN Server.msc即可弹出VisualAVN Server窗口
先创建一个新的仓库,右键 【Repositories】-【CreateNewRepository...】
在仓库“shop”里面新建带目录结构的工程,右键【shop】-【新建】-【project structure...】然后在本地找一个目录,右键检出(很重要!!)
导出在本地
然后复制URL:右键“shop”项目,点击copy URL to clipboard“”即可复制URL
添加管理
然后回到eclipse中,输入刚刚复制的URL 然后eclipse中的项目就可以用SVN管理了,如下
把项目用 svn管理起来
比如现在新建一个动态web项目“shop”,将其用SVN管理起来右键 【项目】-【team】-【share project...】-【SVN】
然后可以看到项目变成了这样,左下角有一个星号此时就可以让项目与资源库同步了,右键 【shop项目】-【team】-【与资源库同步】
,即可打开SVN同步窗口 然后就可以看到被SVN管理起来的项目了:
断开管理
如果现在我们不想让SVN管理“shop”项目了,只需要在右键【shop项目】-【team】-【断开连接】然后就可以看到shop项目变成了一个单机的项目了
不小心删除 (导出在本地)
如果此时我们不小心删除掉这个shop项目,我们还可以检出这个项目,找到SVN资源库,在项目根目录下右键【检出为...】
常用操作
比如现在给shop项目的user.java添加一个Integer类型的age属性后,要将其提交到SVN 右键【shop项目】-【team】-【与资源库同步】提交后就成功地将更改部分保存到SVN中了,如下表示成功提交了
跟新操作
在eclipse中右键【shop项目】-【team】-【与资源库同步】,然后在SVN同步窗口中右键【shop项目】-【更新】,即可更新项目
先删除剩余的部分操作
先删除不要的文件,然后剩下的步骤同提交项目的步骤,即先与资源库同步,再提交
比如删除com.lijiang.web包,
删除成功
解决冲突
先更新,再保留合并后的代码(删除多余的注释和代码),再提交即可解决冲突
一般我们开发项目是在trunk(主干)中,如果我们想要发布项目,就要把项目放在tags中
先在eclipse中右键【shop项目】-【team】-【分支/标记...】
将主干项目放到branches(分支)上
我们在开发新的功能或者做一些实验的时候,会建立一个分支(branches),在分支中写代码,完了之后再合并到主干中
首先右键 【shop项目】-【team】-【分支/标记...】
如果shop项目在主干上,我们还可以将其切换到branches分支,右键【shop项目】-【team】-【切换】-【浏览】-【branches】
修改分支项目,并合并到主干上;
首先要将修改后的分支代码进行提交,然后切换到主干项目,右键【team】-【更新】,再【team】-【合并】然后就可以看到合并了,此时千万不要忘记提交主干项目!!
小技巧
经过一段时间的试错研究,我发现了一种更简单快捷,出错率较低的步骤:一,将eclipse项目部署到svn上
1,打开svnServer的安装路径-【bin】-【VisualSVN Server.msc】,
然后右键 【Repositories】-【createnewrepository】-【regular...】-【取个仓库名(建议和项目名相同)】-【single-projects...】-【All...】
,
然后右键刚创建的仓库-【copy URL to clipboard】
2,在eclipse中右键项目-【Team】-【Share project】-【svn】-【创建新的资源库位置】-【粘贴刚刚复制的URL】-【next】-【使用指定的模块名】-【浏览】-【trunk】-【next】-【写注释后,点击finish】
3,右键项目-【提交】-【写注释后,点击OK】。
然后我们就可以在项目的文件路径位置处发现项目有绿色勾勾了!二,取消项目部署
在eclipse中右键项目【team】-【断开连接】-【并且从文件系统中删除svn元信息】。
然后就可以在项目的文件路径位置发现没有绿色勾勾了,eclipse中也没有仓库图标了
至此SVN教程终!
参考 :
感谢原创作者的辛勤付出
svn官网
~李疆
: 在eclipse中使用SVN菜鸟教程