SVN看这一篇就够了!

1、SVN介绍

1.1 简介

​ SVN全称Subversion,是一个开放源代码的版本控制系统,Subversion在2000年由CollabNet Inc开发,现在发展成为Apache软件基金会的一个项目,同样是一个丰富的开发者和用户社区的一部分。

​ SVN是一个开放源代码的版本控制系统,管理着随时间改变的数据。这些数据放置在一个中央资料档案库(repository)中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本,或是浏览文件的变动历史。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。

1.2、主要作用

  1. 目录版本控制

    Subversion实现了一个"虚拟"的版本控管文件系统,能够依时间跟踪整个目录的变动。目录和文件都能进行版本控制。

  2. 真实的版本历史

    Subversion中,可以增加(add)、删除(delete)、复制(copy)和重命名(rename),无论是文件还是目录。所有的新加的文件都从一个新的、干净的版本开始。

  3. 自动提交
    一个提交动作,不是全部更新到了档案库中,就是完全不更新。这允许开发人员以逻辑区间建立并提交变动,以防止当部分提交成功时出现的问题。

1.3、基本概念

  • Repository(源代码库)︰源代码统一存放的地方
  • Checkout(提取)︰当你手上没有源代码的时候,你需要从repository checkout一份
  • Commit(提交)∶当你已经修改了代码,你就需要Commit到repository
  • Update (更新):当你已经Checkout了一份源代码,Update后就可以和Repository上的源代码同步

1.4、工作流程

1、从服务器下载项目组最新代码。(Checkout)

2、如果已经Checkout并且有人已Commit了代码,你可以更新以获得最新代码。(Update)

3、进入自己的分支,进行工作,每隔一个小时向服务器自己的分支提交一次代码(很多人都有这个习惯。因为有时候自己对代码改来改去,最后又想还原到前一个小时的版本,或者看看前一个小时自己修改了哪些代码,就需要这样做了)。(Commit)

4、下班时间快到了,把自己的分支合并到服务器主分支上,一天的工作完成,并反映给服务器。(Commit)

注意: 如果两个程序员同时修改了同一个文件,SVN可以合并这两个程序员的改动,实际上SVN管理源代码是以行为单位的,就是说两个程序员只要不是修改了同一行程序,SVN都会自动合并两种修改。如果是同一行,SVN会提是文件冲突,需要手动确认。

1.5、声明周期

1、创建版本库

版本库相当于一个集中的空间,用于存放开发者所有的工作成果。版本库不仅能存放文件,还包括了每次修改的历史,即每个文件的变动历史。

Create操作是用来创建一个新的版本库。大多数情况下这个操作只会执行一次。当你创建一个新的版本库的时候,你的版本控制系统会让你提供一些信息来标识版本库,例如创建的位置和版本库的名字。

2、检出

Checkout操作是用来从版本库创建一个工作副本。工作副本是开发者私人的工作空间,可以进行内容的修改,然后提交到版本库中。

3、更新

顾名思义,update 操作是用来更新版本库的。这个操作将工作副本与版本库进行同步。由于版本库是由整个团队共用的,当其他人提交了他们的改动之后,你的工作副本就会过期。

让我们假设Tom和Jerr内是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。

此时Tom的工作副本就过期了。更新操作将会从版本库中拉取Jerry的最新改动并将Tom的工作副本进行更新。

4、执行变更

当检出之后,你就可以做很多操作来执行变更。编辑是最常用的操作。你可以编辑已存在的文件来,例如进行文件的添加/删除操作。

你可以添加文件/目录。但是这些添加的文件目录不会立刻成为版本库的一部分,而是被添加进待变更中,直到执行了commit 操作后才会成为版本库的一部分。

同样地你可以删除文件/目录。删除操作立刻将文件从工作副本中删除掉,但该文件的实际删除只是被添加到了待变更列表中,直到执行了commit 操作后才会真正删除。

Rename 操作可以更改文件/目录的名字。"移动"操作用来将文件/目录从一处移动到版本库中的另一处。

5、复查变化

当你检出工作副本或者更新工作副本后,你的工作副本就跟版本库完全同步了。但是当你对工作副本进行一些修改之后,你的工作副本会比版本库要新。在commit操作之前复查下你的修改是一个很好的习惯。

Status 操作列出了工作副本中所进行的变动。正如我们之前提到的,你对工作副本的任何改动都会成为待变更列表的一部分。Status操作就是用来查看这个待变更列表。
细信息。

Status 操作只是提供了一个变动列表,但并不提供变动的详细信息。你可以用diff操作来查看这些变动的详

6、修复错误

我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候revert操作将会帮助你。

Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。

7、解决冲突

合并的时候可能会发生冲突。Merge操作会自动处理可以安全合并的东西。其它的会被当做冲突。例如,"hello.c"文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。

8、提交变更

Commit操作是用来将更改从工作副本到版本库。这个操作会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。

在提交之前,你必须将文件/目录添加到待变更列表中。列表中记录了将会被提交的改动。当提交的时候,我们通常会提供一个注释来说明为什么会进行这些改动。这个注释也会成为版本库历史记录的一部分。Commit是一个原子操作,也就是说要么完全提交成功,要么失败回滚。用户不会看到成功提交一半的情况。

2、SVN环境搭建

2.1、下载

https://www.visualsvn.com/downloads/(服务端)

https://tortoisesvn.net/downloads.html(客户端)

2.2、配置

1、设置IP和端口

打开服务器,点击VisualSVN Server,选择Configure authentication options...

image-20210529215033913

设置Server name,建议使用当前IP

image-20210530172427175
  • Server name的值可以设置为
    • 127.0.0.1 (只能本地自己访问)
    • 电脑用户名 (只能本地自己访问)
    • 当前IP (能够ping通的IP的用户均可访问)
  • Server Port使用默认值就行
  • 查看当前IP
    • 打开cmd,数据ipconfig,回车

2、新建账号密码

image-20210529215713434

3、新建分组

image-20210529215835439

3、使用

3.1、新建版本库

1、选择Repositories右键,选择Create New Repository...

image-20210529220246878

2、选择默认设置,并设置仓库名称

image-20210529220332628 image-20210529220421398

3、设置仓库目录

image-20210529220734181

4、设置仓库访问权限

5、结果

3.2、导入项目到SVN

1、复制远程仓库的地址

image-20210530172730280

2、选择任意项目,右键选择TortoiseSVN,选择import

image-20210529221634635

3、将复制的仓库地址黏贴到地址栏

image-20210530173242977

4、选择永久接受

image-20210530174117109

5、输入账号密码

image-20210530174222768

6、导入成功

image-20210530174256761

7、刷新仓库,在服务器看到效果

image-20210530174344632

3.3、检索项目

1、复制要下载项目的远程项目

2、在要下载的目录,右键选择SVN Checkout...

image-20210529224520084

3、输入远程地址,设置项目的存放位置

image-20210530174645834

4、成功

image-20210530174719946

3.4、提交代码

1、新建文件,右键如下操作

image-20210529225334522

2、再次点击右键如下操作

image-20210530174951202

3、提交成功

image-20210530175045914

3.5、更新代码

1、在项目空地方右键,选择SVN Update

image-20210529230153155

2、更新成功

image-20210530175350518

3.6、版本冲突问题

3.6.1 版本冲突原因

假设A、B两个用户都在版本号为100的时候,更新了readme.txt这个文件,A用户在修改完成之后提交readme.txt到服务器,这个时候提交成功,这个时候readme.txt文件的版本号已经变成101了。同时B用户在版本号为100的readme.txt文件上作修改,修改完成之后提交到服务器时,由于不是在当前最新的101版本上作的修改,所以导致提交失败。此时用户B去更新文件,如果B用户和A用户修改了文件的同一行代码,就会出现冲突

3.6.2 版本冲突现象

冲突发生时,subversion会在当前工作目录中保存所有的目标文件版本[上次更新版本、当前获取的版本(即别人提交的版本)、自己更新的版本、目标文件]。

假设文件名是readme.txt

对应的文件名分别是:

  • readme.txt.r101
  • readme.txt.r102
  • readme.txt.mine
  • readme.txt

同时在目标文件中标记来自不同用户的更改。

3.6.3 版本冲突解决

1、现在A、B两个用户都更新项目文件到本地

用户A

image-20210529233316045

2、项目中readme.txt文件初始内容

image-20210529233355519

3、A用户修改文件,完成后提交到服务器

image-20210529233521734 image-20210530175732514

4、b用户修改内容

image-20210529233832406

5、B用户提交更新至服务器提示如下

image-20210530175836388

6、B用户将文件提交至服务器时,提示版本过期:首先应该从版本库更新版本,然后去解决冲突,冲突解决后要执行svn resolved(解决),然后在签入到版本库。在冲突解决之后,需要使用svn resolved(解决)来告诉subversion冲突解决,这样才能提交更新。

解决冲突的三种选择

  1. 放弃自己的更新,使用svn revert(回滚),然后提交。在这种方式下不需要使用svn resolved(解决)
  2. 放弃自己的更新,使用别人的更新。使用最新获取的版本覆盖目标文件,执行resolved filename并提交(选择文件—右键—解决)。
  3. 手动解决:冲突发生时,通过和其他用户沟通之后,手动更新目标文件。然后执行resolved filename来解除冲突,最后提交。

解决冲突

1、在B用户当前目录下,右键选择SVN Update,执行update

image-20210530180004074

2、B用户中的readme.txt文件出现冲突

image-20210530180052793

3、在冲突的文件上右键

image-20210530180330161

4、打开编辑冲突的窗口

image-20210530180444613

说明

  • Theirs窗口为服务器上当前最新版本
  • Mine窗口为本地修改过的版本
  • Merged窗口为合并后的文件显示内容

5、如果要使用服务器版本,在Theirs窗口选中差异内容,右键,选择Use this text block(使用这段文本块)。同理如果要使用本地版本,在协商后,在Mine窗口右键,选择Use this text block(使用这段文本块)。

image-20210530181448808

6、修改完成后进行如下操作

image-20210530181603289

7、此时冲突已经解决,可以再次提交B用户修改的

image-20210530181724601

注:也可先不标记为解决,直接保存文件后,在B用户的冲突目录下,选中文件—右键菜单—TortoiseSVN—Resolved(解决)。然后再提交文件。

如何降低冲突解决的复杂度

  1. 当文档编辑完成后,尽快提交,频繁的提交/更新可以降低在冲突发生的概率,以及发生时解决冲突的复杂度。

  2. 在提交时,写上明确的message,方便以后查找用户更新的原因,毕竟随着时间的推移,对当初更新的原因有可能会遗忘

  3. 养成良好的使用习惯,使用SVN时每次都是先提交,后更新。每天早上打开后,首先要从版本库获取最新版本。每天下班前必须将已经编辑过的文档都提交到版本库。

4、IDEA集成使用SVN

1、File—》Other Settings(全局配置,Settings是局部配置) —》Version Control —》Subversion

image-20210530182437373

2、配置SVN

image-20210530182702382

提示

  • 找不到svn.exe文件,TortoiseSVN的bin目录下面没有svn.exe
  • 之所以没有是因为安装TortoiseSVN的时候没有勾选指定安装项,添加command line client tools

使用

1、检索项目

1、VCS —》Get...

image-20210530184508389

2、添加远程仓库中项目的url

image-20210530184955266

3、选择存放的文件夹

image-20210530185200119

4、选择Destination,根据自己偏好

image-20210530185327850

5、选择1.8Format

image-20210530185402822

6、是否要打开,yse

image-20210530185456440

6、选择add

image-20210530185602260

7、此时项目就和远程相连了

image-20210530185724902

2、提交代码

1、选择VCS—》Commit...

image-20210530185904324 image-20210530190321567

2、提交成功后IDEA下面会有提示信息

image-20210530190437132

注:提交代码时,最好新更新

3、更新代码

1、VCS—》Update Project...

image-20210530190658875

2、默认即可

image-20210530191127866

3、更新成功会有提示

image-20210530191213967

4、版本冲突问题

1、如果未更新,就提交资源(有其他用户也提交过资源)就提交失败

2、演示还和之前没有IDEA一样,比如现在B中修改后提交,然后在A中更改同一行代码提交就会报错

image-20210530192356787

3、这时我们要进行更新操作,这时就会出现冲突

image-20210530192534623

4、通常选用合并

image-20210530194728272

5、会有提示更新成功

image-20210530194842791

6、再次提交解决冲突

5、导入项目到SVN

1、VCS—》import into Version Control—》import into Subversion

image-20210530195752527

2、选择“+”号添加项目导入的地址

image-20210530200205601

3、选择要导入的路径

image-20210530200221989

4、选择要导入的项目

image-20210530200503831

5、检查导入信息,填写信息

image-20210530200556063

6、检查远程仓库

image-20210530200639636

posted @ 2021-06-06 17:26  JavaConner  阅读(458)  评论(0)    收藏  举报