SVN

一 、 简介

  1. 开源的版本控制系统
  2. 中央管理
  3. SVN中的一些概念:
    1. repository : 源码同一存放的地方
    2. checkout : 没有源码时 ,提取代码
    3. commit : 修改完之后 , 提交代码
    4. update : 更新代码 , 获取中央仓库中最新的代码
  4. 实际开发流程:
    1. 假设你已经checkout并且已经工作几天了 : Update(获取最新的代码) –> 做出自己的修改 –> commit (让大家看到你的修改) 。
    2. 但是在实际操作过程中 , 可能出现两个程序员在同一次提交中修改了同一行代码代码 , 造成了代码冲突 ,需要手动确认 。 (根本原因是后提交的程序员获取到的已经不是最新的源码了 , 导致提交失效) 。
  5. SVN的主要功能
    1. 目录版本控制

      1. 依据时间跟踪整个目录的变动
    2. 真实的版本历史
      1. 支持增加 、 删除
    3. 自动提交
      1. 提交时保证操作的原子性 , 要么都提交成功 , 要么都提交不成功 。
    4. 纳入版本管控的元数据
      1. 每一个文件或目录都附有一组属性关键字和属性值相关联 , 你可以创建并存储任何你想要的key/value对 , 属性是有时间来版本管控的 , 就像文件内容一样
    5. 选择不同的网络层
      1. Subversion 可以作为一个扩展模块嵌入到Apache HTTP 服务器中 。
    6. 一致的数据处理方式
      1. Subversion 使用二进制差异算法表示文件的差异 , 他对文字和视屏或音频都一视同仁 。 在SVN 中文件都以压缩形式存储在档案库中 , 而且文件差异是以两个方向在网络上传输的 。
    7. 有效的分支与标签
      1. 在分支与标签的消耗上不一定与项目的大小成正比 , Subversion 的建立分支与标签的方法, 就只是复制该项目 , 使用的方法就类似于硬连接 , 所以这些操作只会花费很小 , 而且是固定的时间 。
      2. 扩展: 硬连接是对于同一文件系统的一个文件的连接,节点是文件存在的唯一标识,在文件系统中是唯一的,但在不同的文件系统则有可能重复。这样的话,在不同文件系统中作链接时,是不能使用ln A B,应该用符号连接,即是软连接,它只是包含了系统中一个完整的路径名引用。硬连接就是记录了文件的地址,你在文件管理器中看到的每个文件都是磁盘里文件的“硬连接”。当一个文件的所有硬连接都被删除的时候,该文件占用的空间才可以被新加入的数据覆盖。(来自百度 ,哈哈哈哈)。
    8. Hackability
      1. Subversion没有任何的历史包袱; 它主要是一群共用的 C 程序库, 具有定义完善的API。这使得 Subversion 便于维护, 并且可被其它应用程序与程序语言使用。
  6. Subversion 由于CVS之处
    1. 原子提交 。 一次提交不管是单个还是多个文件 , 都作为一个整体提交 , 要么都提交成功 ,要么都失败 。 这样不会引起文件的不完整和损坏 。
    2. 重命名 、 删除 、 复制文件等动作都保存在版本历史记录中 。
    3. 对于二进制文件使用了节省空间的保存方法 。 (只保存和上一版本不同之处)
    4. 目录也有版本历史 。 整个目录树可以被移动或复制 , 操作简单 , 而且能够保存全部版本记录 。
    5. 分支开销非常小
    6. 优化过的数据库访问 , 使得一些操作不必访问数据库就可以得到 。 减少了不必要的网络访问 。

二、 安装

三 、 SVN 生命周期

  1. 创建版本库

    1. 版本库相当于一个集中的空间 , 用于存放开发者所有的工作成果 。 版本不仅能存放文件 , 还包括了每次修改的历史 , 即每个文件的 变动历史 。
    2. create操作是用来创建一个新的版本库 , 大多数情况下这个操作只会执行一次 , 当创建一个新的版本库的时候 , 你的SVN 会让你提供一些信息来唯一标示版本库, 例如:创建的位置 、 版本库的名字 。
  2. 检出

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

    1. update操作是用来更新版本库的 , 这个操作将工作空间和版本库同步 。 由于版本库是有整个开发团队公用的 , 所以当别人提交了代码改动之后 ,你的工作副本 就会过期 。
    2. 让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。
    3. 此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。
  4. 执行变更
    1. 当检出之后 ,你就可以做很多操作来执行变更。编辑是最常用的操作。你可以编辑已存在的文件来,例如进行文件的添加/删除操作。
    2. 你可以添加文件/目录。但是这些添加的文件目录不会立刻成为版本库的一部分,而是被添加进待变更列表中,直到执行了 commit 操作后才会成为版本库的一部分。
    3. 同样地你可以删除文件/目录。删除操作立刻将文件从工作副本中删除掉,但该文件的实际删除只是被添加到了待变更列表中,直到执行了 commit 操作后才会真正删除。
    4. Rename 操作可以更改文件/目录的名字。”移动”操作用来将文件/目录从一处移动到版本库中的另一处。
  5. 复查变化
    1. 当你检出工作副本或者更新工作副本后,你的工作副本就跟版本库完全同步了。但是当你对工作副本进行一些修改之后,你的工作副本会比版本库要新。在 commit 操作之前复查下你的修改是一个很好的习惯。
    2. Status 操作列出了工作副本中所进行的变动。正如我们之前提到的,你对工作副本的任何改动都会成为待变更列表的一部分。Status 操作就是用来查看这个待变更列表。
    3. Status 操作只是提供了一个变动列表,但并不提供变动的详细信息。你可以用 diff 操作来查看这些变动的详细信息。
  6. 修复错误
    1. 我们来假设你对工作副本做了许多修改,但是现在你不想要这些修改了,这时候 revert 操作将会帮助你。
    2. Revert 操作重置了对工作副本的修改。它可以重置一个或多个文件/目录。当然它也可以重置整个工作副本。在这种情况下,revert 操作将会销毁待变更列表并将工作副本恢复到原始状态。
  7. 解决冲突
    1. 合并的时候可能会发生冲突。Merge 操作会自动处理可以安全合并的东西。其它的会被当做冲突。例如,”hello.c” 文件在一个分支上被修改,在另一个分支上被删除了。这种情况就需要人为处理。Resolve 操作就是用来帮助用户找出冲突并告诉版本库如何处理这些冲突。
  8. 提交更改
    1. Commit 操作是用来将更改从工作副本到版本库。这个操作会修改版本库的内容,其它开发者可以通过更新他们的工作副本来查看这些修改。
    2. 在提交之前,你必须将文件/目录添加到待变更列表中。列表中记录了将会被提交的改动。当提交的时候,我们通常会提供一个注释来说明为什么会进行这些改动。这个注释也会成为版本库历史记录的一部分。Commit 是一个原子操作,也就是说要么完全提交成功,要么失败回滚。用户不会看到成功提交一半的情况。

四 、 SVN的启动模式

    首先,在服务端进行SVN版本库的相关配置手动新建版本库目录mkdir /opt/svn利用svn命令创建版本库svnadmin create /opt/svn/runoob使用命令svnserve启动服务svnserve -d -r 目录 --listen-port 端口号-r: 配置方式决定了版本库访问方式。--listen-port: 指定SVN监听端口,不加此参数,SVN默认监听3690由于-r 配置方式的不一样,SVN启动就可以有两种不同的访问方式方式一:-r直接指定到版本库(称之为单库svnserve方式)svnserve -d -r /opt/svn/runoob在这种情况下,一个svnserve只能为一个版本库工作。authz配置文件中对版本库权限的配置应这样写:[groups]admin=user1dev=user2[/]@admin=rwuser2=r使用类似这样的URL:svn://192.168.0.1/ 即可访问runoob版本库方式二:指定到版本库的上级目录(称之为多库svnserve方式)svnserve -d -r /opt/svn这种情况,一个svnserve可以为多个版本库工作authz配置文件中对版本库权限的配置应这样写:[groups]admin=user1dev=user2[runoob:/]@admin=rwuser2=r[runoob01:/]@admin=rwuser2=r如果此时你还用[/],则表示所有库的根目录,同理,[/src]表示所有库的根目录下的src目录。使用类似这样的URL:svn://192.168.0.1/runoob 即可访问runoob版本库。

五 、 创建版本库

使用svn命令创建资源库[runoob@centos6 ~]# svnadmin create /opt/svn/runoob01
[runoob@centos6 ~]# ll /opt/svn/runoob01/
total 24
drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 conf
drwxr-sr-x 6 root root 4096 2016/08/23 16:31:06 db
-r--r--r-- 1 root root    2 2016/08/23 16:31:06 format
drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 hooks
drwxr-xr-x 2 root root 4096 2016/08/23 16:31:06 locks
-rw-r--r-- 1 root root  229 2016/08/23 16:31:06 README.txt
进入/opt/svn/runoob01/conf目录 修改默认配置文件配置,包括svnserve.conf、passwd、authz 配置相关用户和权限。1、svn服务配置文件svnserve.confsvn服务配置文件为版本库目录中的文件conf/svnserve.conf。该文件仅由一个[general]配置段组成。[general]
anon-access = none
auth-access = write
password-db = /home/svn/passwd
authz-db = /home/svn/authz
realm = tiku
anon-access: 控制非鉴权用户访问版本库的权限,取值范围为"write"、"read"和"none"。 即"write"为可读可写,"read"为只读,"none"表示无访问权限。 缺省值:readauth-access: 控制鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。 即"write"为可读可写,"read"为只读,"none"表示无访问权限。 缺省值:writeauthz-db: 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。 除非指定绝对路径,否则文件位置为相对conf目录的相对路径。 缺省值:authzrealm: 指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的 认证域相同,建议使用相同的用户名口令数据文件。 缺省值:一个UUID(Universal Unique IDentifier,全局唯一标示)。2、用户名口令文件passwd用户名口令文件由svnserve.conf的配置项password-db指定,缺省为conf目录中的passwd。该文件仅由一个[users]配置段组成。[users]配置段的配置行格式如下:<用户名> = <口令>
[users]
admin = admin
thinker = 123456
3、权限配置文件权限配置文件由svnserve.conf的配置项authz-db指定,缺省为conf目录中的authz。该配置文件由一个[groups]配置段和若干个版本库路径权限段组成。[groups]配置段中配置行格式如下:<用户组> = <用户列表>
版本库路径权限段的段名格式如下:[<版本库名>:<路径>]
[groups]
g_admin = admin,thinker[admintools:/]
@g_admin = rw
* =[test:/home/thinker]
thinker = rw
* = r
本例是使用svnserve -d -r /opt/svn 以多库svnserve方式启动SVN,所以URL:svn://192.168.0.1/runoob01

六 、 检出操作

svn checkout http://svn.server.com/svn/project_repo --username=user01 以上命令将产生如下结果:root@runoob:~/svn# svn checkout svn://192.168.0.1/runoob01 --username=user01
A    runoob01/trunk
A    runoob01/branches
A    runoob01/tags
Checked out revision 1.
检出成功后在当前目录下生成runoob01副本目录。查看检出的内容root@runoob:~/svn# ll runoob01/
total 24
drwxr-xr-x 6 root root 4096 Jul 21 19:19 ./
drwxr-xr-x 3 root root 4096 Jul 21 19:10 ../
drwxr-xr-x 2 root root 4096 Jul 21 19:19 branches/
drwxr-xr-x 4 root root 4096 Jul 21 19:19 .svn/
drwxr-xr-x 2 root root 4096 Jul 21 19:19 tags/
drwxr-xr-x 2 root root 4096 Jul 21 19:19 trunk/
你想查看更多关于版本库的信息,执行 info 命令。

七、 SVN 解决冲突

版本冲突原因:
假设 A、B 两个用户都在版本号为 100 的时候,更新了 kingtuns.txt 这个文件,A 用户在修改完成之后提交 kingtuns.txt 到服务器, 这个时候提交成功,这个时候 kingtuns.txt 文件的版本号已经变成 101 了。同时B用户在版本号为 100 的 kingtuns.txt 文件上作修改, 修改完成之后提交到服务器时,由于不是在当前最新的 101 版本上作的修改,所以导致提交失败。我们已在本地检出 runoob01 库,下面我们将实现版本冲突的解决方法。我们发现 HelloWorld.html 文件存在错误,需要修改文件并提交到版本库中。我们将 HelloWorld.html 的内容修改为 "HelloWorld! http://www.runoob.com/"。root@runoob:~/svn/runoob01/trunk# cat HelloWorld.html
HelloWorld! http://www.runoob.com/
用下面的命令查看更改:root@runoob:~/svn/runoob01/trunk# svn diff
Index: HelloWorld.html
===================================================================
--- HelloWorld.html     (revision 5)
+++ HelloWorld.html     (working copy)
@@ -1,2 +1 @@
-HelloWorld! http://www.runoob.com/
+HelloWorld! http://www.runoob.com/!
尝试使用下面的命令来提交他的更改:root@runoob:~/svn/runoob01/trunk# svn commit -m "change HelloWorld.html first"
Sending        HelloWorld.html
Transmitting file data .svn: E160028: Commit failed (details follow):
svn: E160028: File '/trunk/HelloWorld.html' is out of date
这时我发现提交失败了。因为此时,HelloWorld.html 已经被 user02 修改并提交到了仓库。Subversion 不会允许 user01(本例使用的 svn 账号)提交更改,因为 user02 已经修改了仓库,所以我们的工作副本已经失效。为了避免两人的代码被互相覆盖,Subversion 不允许我们进行这样的操作。所以我们在提交更改之前必须先更新工作副本。所以使用 update 命令,如下:root@runoob:~/svn/runoob01/trunk# svn update
Updating '.':
C    HelloWorld.html
Updated to revision 6.
Conflict discovered in file 'HelloWorld.html'.
Select: (p) postpone, (df) show diff, (e) edit file, (m) merge,(mc) my side of conflict, (tc) their side of conflict,(s) show all options: mc
Resolved conflicted state of 'HelloWorld.html'
Summary of conflicts:Text conflicts: 0 remaining (and 1 already resolved)
这边输入"mc",以本地的文件为主。你也可以使用其选项对冲突的文件进行不同的操作。默认是更新到最新的版本,我们也可以指定更新到哪个版本svn update -r6
此时工作副本是和仓库已经同步,可以安全地提交更改了root@runoob:~/svn/runoob01/trunk# svn commit -m "change HelloWorld.html second"
Sending        HelloWorld.html
Transmitting file data .
Committed revision 7.

八 、 提交操作

我们在库本版中需要增加一个readme的说明文件。root@runoob:~/svn/runoob01/trunk# cat readme
this is SVN tutorial.
查看工作副本中的状态。root@runoob:~/svn/runoob01/trunk# svn status
?       readme
此时 readme的状态为?,说明它还未加到版本控制中。将文件readme加到版本控制,等待提交到版本库。root@runoob:~/svn/runoob01/trunk# svn add readme
A         readme
查看工作副本中的状态root@runoob:~/svn/runoob01/trunk# svn status
A       readme
此时 readme的状态为A,它意味着这个文件已经被成功地添加到了版本控制中。为了把 readme 存储到版本库中,使用 commit -m 加上注释信息来提交。如果你忽略了 -m 选项, SVN会打开一个可以输入多行的文本编辑器来让你输入提交信息。root@runoob:~/svn/runoob01/trunk# svn commit -m "SVN readme."
Adding         readme
Transmitting file data .
Committed revision 8.
svn commit -m "SVN readme."
现在 readme 被成功地添加到了版本库中,并且修订版本号自动增加了1。

九、 版本回退

当我们想放弃对文件的修改,可以使用 SVN revert 命令。svn revert 操作将撤销任何文件或目录里的局部更改。我们对文件 readme 进行修改,查看文件状态。root@runoob:~/svn/runoob01/trunk# svn status
M       readme
这时我们发现修改错误,要撤销修改,通过 svn revert 文件 readme 回归到未修改状态。root@runoob:~/svn/runoob01/trunk# svn revert readme
Reverted 'readme'
再查看状态。root@runoob:~/svn/runoob01/trunk# svn status
root@runoob:~/svn/runoob01/trunk#
进行 revert 操作之后,readme 文件恢复了原始的状态。 revert 操作不单单可以使单个文件恢复原状, 而且可以使整个目录恢复原状。恢复目录用 -R 命令,如下。svn revert -R trunk
但是,假如我们想恢复一个已经提交的版本怎么办。为了消除一个旧版本,我们必须撤销旧版本里的所有更改然后提交一个新版本。这种操作叫做 reverse merge。首先,找到仓库的当前版本,现在是版本 22,我们要撤销回之前的版本,比如版本 21。svn merge -r 22:21 readme

十 、 查看历史信息

通过svn命令可以根据时间或修订号去除过去的版本,或者某一版本所做的具体的修改。以下四个命令可以用来查看svn 的历史:svn log: 用来展示svn 的版本作者、日期、路径等等。svn diff: 用来显示特定修改的行级详细信息。svn cat: 取得在特定版本的某文件显示在当前屏幕。svn list: 显示一个目录或某一版本存在的文件。1、svn log
可以显示所有的信息,如果只希望查看特定的某两个版本之间的信息,可以使用:root@runoob:~/svn/runoob01/trunk# svn log -r 6:8
------------------------------------------------------------------------
r6 | user02 | 2016-11-07 02:01:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html first.
------------------------------------------------------------------------
r7 | user01 | 2016-11-07 02:23:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html second
------------------------------------------------------------------------
r8 | user01 | 2016-11-07 02:53:13 +0800 (Mon, 07 Nov 2016) | 1 lineSVN readme.
------------------------------------------------------------------------
如果只想查看某一个文件的版本修改信息,可以使用 svn log 文件路径。root@runoob:~/svn/runoob01# svn log trunk/HelloWorld.html
------------------------------------------------------------------------
r7 | user01 | 2016-11-07 02:23:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html second
------------------------------------------------------------------------
r6 | user02 | 2016-11-07 02:01:26 +0800 (Mon, 07 Nov 2016) | 1 linechange HelloWorld.html first.
------------------------------------------------------------------------
r5 | user01 | 2016-11-07 01:50:03 +0800 (Mon, 07 Nov 2016) | 1 line------------------------------------------------------------------------
r4 | user01 | 2016-11-07 01:45:43 +0800 (Mon, 07 Nov 2016) | 1 lineAdd function to accept input and to display array contents
------------------------------------------------------------------------
r3 | user01 | 2016-11-07 01:42:35 +0800 (Mon, 07 Nov 2016) | 1 line------------------------------------------------------------------------
r2 | user01 | 2016-08-23 17:29:02 +0800 (Tue, 23 Aug 2016) | 1 linefirst file
------------------------------------------------------------------------
如果希望得到目录的信息要加 -v。如果希望显示限定N条记录的目录信息,使用 svn log -l N -v。root@runoob:~/svn/runoob01/trunk# svn log -l 5 -v
------------------------------------------------------------------------
r6 | user02 | 2016-11-07 02:01:26 +0800 (Mon, 07 Nov 2016) | 1 line
Changed paths:M /trunk/HelloWorld.htmlchange HelloWorld.html first.
------------------------------------------------------------------------
r5 | user01 | 2016-11-07 01:50:03 +0800 (Mon, 07 Nov 2016) | 1 line
Changed paths:M /trunk/HelloWorld.html------------------------------------------------------------------------
r4 | user01 | 2016-11-07 01:45:43 +0800 (Mon, 07 Nov 2016) | 1 line
Changed paths:M /trunk/HelloWorld.htmlAdd function to accept input and to display array contents
------------------------------------------------------------------------
r3 | user01 | 2016-11-07 01:42:35 +0800 (Mon, 07 Nov 2016) | 1 line
Changed paths:A /trunk/HelloWorld.html (from /trunk/helloworld.html:2)D /trunk/helloworld.html------------------------------------------------------------------------
r2 | user01 | 2016-08-23 17:29:02 +0800 (Tue, 23 Aug 2016) | 1 line
Changed paths:A /trunk/helloworld.htmlfirst file
------------------------------------------------------------------------
2、svn diff
用来检查历史修改的详情。检查本地修改
比较工作拷贝与版本库
比较版本库与版本库
(1)、如果用 svn diff,不带任何参数,它将会比较你的工作文件与缓存在 .svn 的"原始"拷贝。root@runoob:~/svn/runoob01/trunk# svn diff
Index: rules.txt
===================================================================
--- rules.txt (revision 3)
+++ rules.txt (working copy)
@@ -1,4 +1,5 @@
Be kind to others
Freedom = Responsibility
Everything in moderation
-Chew with your mouth open
(2)、比较工作拷贝和版本库比较你的工作拷贝和版本库中版本号为 3 的文件 rule.txt。svn diff -r 3 rule.txt
(3)、比较版本库与版本库通过 -r(revision) 传递两个通过冒号分开的版本号,这两个版本会进行比较。比较 svn 工作版本中版本号2和3的这个文件的变化。svn diff -r 2:3 rule.txt
3、svn cat
如果只是希望检查一个过去版本,不希望查看他们的区别,可使用svn catsvn cat -r 版本号 rule.txt
这个命令会显示在该版本号下的该文件内容4、svn list
svn list 可以在不下载文件到本地目录的情况下来察看目录中的文件:$ svn list http://192.168.0.1/runoob01
README
branches/
clients/
tags/

十一、 分支

Branch 选项会给开发者创建出另外一条线路。当有人希望开发进程分开成两条不同的线路时,这个选项会非常有用。比如项目 demo 下有两个小组,svn 下有一个 trunk 版。由于客户需求突然变化,导致项目需要做较大改动,此时项目组决定由小组 1 继续完成原来正进行到一半的工作(某个模块),小组 2 进行新需求的开发。那么此时,我们就可以为小组2建立一个分支,分支其实就是 trunk 版(主干线)的一个copy版,不过分支也是具有版本控制功能的,而且是和主干线相互独立的,当然,到最后我们可以通过(合并)功能,将分支合并到 trunk 上来,从而最后合并为一个项目。我们在本地副本中创建一个 my_branch 分支。root@runoob:~/svn/runoob01# ls
branches  tags  trunk
root@runoob:~/svn/runoob01# svn copy trunk/ branches/my_branch
A         branches/my_branch
root@runoob:~/svn/runoob01#
查看状态:root@runoob:~/svn/runoob01# svn status
A  +    branches/my_branch
A  +    branches/my_branch/HelloWorld.html
A  +    branches/my_branch/readme
提交新增的分支到版本库。root@runoob:~/svn/runoob01# svn commit -m "add my_branch"
Adding         branches/my_branch
Replacing      branches/my_branch/HelloWorld.html
Adding         branches/my_branch/readmeCommitted revision 9.
接着我们就到 my_branch 分支进行开发,切换到分支路径并创建 index.html 文件。root@runoob:~/svn/runoob01# cd branches/my_branch/
root@runoob:~/svn/runoob01/branches/my_branch# ls
HelloWorld.html  index.html  readme
将 index.html 加入版本控制,并提交到版本库中。root@runoob:~/svn/runoob01/branches/my_branch# svn status
?       index.html
root@runoob:~/svn/runoob01/branches/my_branch# svn add index.html
A         index.html
root@runoob:~/svn/runoob01/branches/my_branch# svn commit -m "add index.html"
Adding         index.html
Transmitting file data .
Committed revision 10.
切换到 trunk,执行 svn update,然后将 my_branch 分支合并到 trunk 中。
root@runoob:~/svn/runoob01/trunk# svn merge ../branches/my_branch/
--- Merging r10 into '.':
A    index.html
--- Recording mergeinfo for merge of r10 into '.':G   .
此时查看目录,可以看到 trunk 中已经多了 my_branch 分支创建的 index.html 文件。root@runoob:~/svn/runoob01/trunk# ll
total 16
drwxr-xr-x 2 root root 4096 Nov  7 03:52 ./
drwxr-xr-x 6 root root 4096 Jul 21 19:19 ../
-rw-r--r-- 1 root root   36 Nov  7 02:23 HelloWorld.html
-rw-r--r-- 1 root root    0 Nov  7 03:52 index.html
-rw-r--r-- 1 root root   22 Nov  7 03:06 readme
将合并好的 trunk 提交到版本库中。root@runoob:~/svn/runoob01/trunk# svn commit -m "add index.html"
Adding         index.html
Transmitting file data .
Committed revision 11.

十二 、 标签

版本管理系统支持 tag 选项,通过使用 tag 的概念,我们可以给某一个具体版本的代码一个更加有意义的名字。Tags 即标签主要用于项目开发中的里程碑,比如开发到一定阶段可以单独一个版本作为发布等,它往往代表一个可以固定的完整的版本,这跟 VSS 中的 Tag 大致相同。我们在本地工作副本创建一个 tag。root@runoob:~/svn/runoob01# svn copy trunk/ tags/v1.0
A         tags/v1.0
上面的代码成功完成,新的目录将会被创建在 tags 目录下。root@runoob:~/svn/runoob01# ls tags/
v1.0
root@runoob:~/svn/runoob01# ls tags/v1.0/
HelloWorld.html  readme
查看状态。root@runoob:~/svn/runoob01# svn status
A  +    tags/v1.0
提交tag内容。root@runoob:~/svn/runoob01# svn commit -m "tags v1.0"
Adding         tags/v1.0
Transmitting file data ..
Committed revision 14.

SVN基本的理解和使用相关推荐

  1. github Git 原理简介

    由于Git是一个DVCS(Distributed Version Control System,分布式版本控制系统),不同于传统的CVS/SVN版本系统那样必须由一个中央服务器来管理所有的版本记录,它 ...

  2. Tarena 课程体系

    .NET+3G+云计算 软件工程师(http://www.tarena.com.cn/course/20111025/784.html) TTS5.0 .NET+3G+云计算 课程体系完全采用&quo ...

  3. Flash 这些知识点你知道多少?

    1.理解flash的显示列表 2.理解事件冒泡,理解鼠标事件等 3.理解flash的性能瓶颈和大多数影响性能的地方 4.理解帧跑道模型,知道timer和enterFrame的关联和区别 5.理解RSL ...

  4. 一些必备的Flash开发知识点

    原文:http://blog.csdn.net/mynameisjiong/article/details/67640369 1.理解flash的显示列表 2.理解事件冒泡,理解鼠标事件等       ...

  5. (转) 对svn分支合并类型和深度的理解

    合并的工作是把主干或者分支上合并范围内的所有改动列出,并对比当前工作副本的内容,由合并者手工修改冲突,然后提交到服务器的相应目录里.如果当前工作副本是主干,则合并的范围是分支上的改动,如果工作副本是分 ...

  6. 说说我理解的SVN操作

    SVN是什么 Svn是一个离线的代码管理,可以多个人一起修改,然后再将修改的内容提交到Svn中. 每一个svn服务器中的数据存储单位叫做存储,但是你不仅仅可以把整个存储当作你维护的内容,也可以将其中的 ...

  7. 理解SVN中trunk,branches,tags

    2019独角兽企业重金招聘Python工程师标准>>> Subversion有一个很标准的目录结构: project +-- trunk +-- branches +-- tags  ...

  8. idea svn的项目无法标识修改新增的类_是时候让你的 IDEA 飞起来啦!

    1.设置maven 1.在File->settings->搜索maven 2.Mavan home directory--设置maven安装包的bin文件夹所在的位置 3.User set ...

  9. centos7上的图形化界面svn客户端_Git实战一:图形客户端规范用法小讲

    git作为一款分布式版本管理工具,受到许多资深码农喜爱,我也刚好是其中一位. 百度上有许多介绍git安装教程.和svn的区别,这些都不再重复,好多也是介绍命令模式操作git,但是今天我要讲的是图形化操 ...

最新文章

  1. Mac OS X 使用命令sed替换tab
  2. python 点计算角度
  3. 选择Java密码算法第1部分-散列
  4. 【前端】第二章 HTML、CSS、JavaScript、DOM和JSON
  5. Redmi 10X Pro样张首曝:搭载流光相机技术 一键成创意大片
  6. java语言程序设计(基础篇) 第2章 基本程序设计 课本源代码
  7. webpack——快速入门【一】
  8. Android 使用SQLiteDatabase操作SQLite数据库(二)
  9. 苹果ppt_从苹果发布会到抖音,火遍互联网的快闪视频如何用PPT轻松制作?
  10. matlab 搜索 nan,MATLAB NaN详解
  11. 王者荣耀战力查询微信小程序源码下载支持安卓苹果微信Q等多区查询
  12. 云栖大会 | Apache Spark 3.0 和 Koalas 最新进展
  13. vivo X90、vivo X90 Pro和vivo X90 Pro+的区别 参数对比哪个好
  14. Android程序猿基本功
  15. 服务器可视化监控系统,可视化服务器监控系统
  16. python定义一个学生类姓名、年龄、性别、成绩、你成绩评价_.定义一个学生类Student,包含三个属性姓名、年龄、性别,创建三个学生对象存入ArrayList集合中。...
  17. 电脑桌面日程管理工具
  18. DDR3 mig 关于引脚绑定的说明
  19. java函数式编程之Supplier
  20. 类与对象:求长方体的体积C++

热门文章

  1. Vim 安装 YouCompleteMe
  2. silverlight 使用IValueConverter 转换
  3. 三种Ext提交数据的方法(转)
  4. 27 款经典的CSS 框架
  5. 7-5 求前N天 (30 分)
  6. c语言switch写值班表,如何用asp编写按周轮换的值班表?例,1月份的值班领导有4位,怎样写可以让4位领导的名字自动到时间显示...
  7. Java黑皮书课后题第7章:7.4(分析成绩)编写一个程序,读入个数不确定的考试分数,并且判断有多少个分数是大于或等于平均分,多少个分数是低于平均分的。输入一个负数表示输入结束。假设最高分是100
  8. Java黑皮书课后题第3章:**3.4(随机月份)编写一个随机产生1和12之间整数的程序,并根据数组1,2,3...显示对应的月份
  9. C#中的深复制与浅复制
  10. 登录注册的基本加密方法(可逆)