SVN 第4章 操作

2021-06-10 鲁鲁槟 收藏

一、Subversion的组件

Subversion安装之后,分为几个部分,这是一个快速浏览。

  • svn:命令行客户端。

  • svnversion:报告工作拷贝状态(当前修订版本的项目)的工具。

  • svnlook:检查版本库的工具。

  • svnadmin:建立、调整和修补版本库的工具。

  • svndumpfilter:过滤Subversion版本库转储文件的工具。

  • mod_dav_svn:Apache HTTP服务器的一个插件,可以让版本库在网络上可见。

  • svnserve:一种单独运行的服务器,可以作为守护进程由SSH调用,另一种让版本库在网络上可见的方式。

二、SVN 解决冲突

①、版本冲突原因

假设 A、B 两个用户都在版本号为 100 的时候,更新了 kingtuns.txt 这个文件,A 用户在修改完成之后提交 kingtuns.txt 到服务器, 这个时候提交成功,这个时候 kingtuns.txt 文件的版本号已经变成 101 了。同时B用户在版本号为 100 的 kingtuns.txt 文件上作修改, 修改完成之后提交到服务器时,由于不是在当前最新的 101 版本上作的修改,所以导致提交失败。

②、解决冲突

我们已在本地检出 runoob01 库,下面我们将实现版本冲突的解决方法。

我们发现 HelloWorld.html 文件存在错误,需要修改文件并提交到版本库中。

我们将 HelloWorld.html 的内容修改为 "HelloWorld! https://www.lulublog.cn"。

用下面的命令查看更改:

svn diff
Index: HelloWorld.html
===================================================================
--- HelloWorld.html     (revision 5)
+++ HelloWorld.html     (working copy)
@@ -1,2 +1 @@
-HelloWorld! https://www.lulublog.cn/
+HelloWorld! https://www.lulublog.cn/!

尝试使用下面的命令来提交他的更改:

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 命令,如下:

svn update

这边输入"mc",以本地的文件为主。你也可以使用其选项对冲突的文件进行不同的操作。

默认是更新到最新的版本,我们也可以指定更新到哪个版本

svn update -r6

此时工作副本是和仓库已经同步,可以安全地提交更改了

svn commit -m "change HelloWorld.html second"

Sending        HelloWorld.html
Transmitting file data .
Committed revision 7.

三、SVN 提交操作

我们在库本版中需要增加一个readme的说明文件。

cat readme 

this is SVN tutorial.

查看工作副本中的状态。

svn status

?       readme

此时 readme的状态为?,说明它还未加到版本控制中。

将文件readme加到版本控制,等待提交到版本库。

svn add readme 

A         readme

查看工作副本中的状态

svn status
  
A       readme

此时 readme的状态为A,它意味着这个文件已经被成功地添加到了版本控制中。

为了把 readme 存储到版本库中,使用 commit -m 加上注释信息来提交。

如果你忽略了 -m 选项, SVN会打开一个可以输入多行的文本编辑器来让你输入提交信息。

svn commit -m "SVN readme."

Adding         readme
Transmitting file data .
Committed revision 8.
svn commit -m "SVN readme."

现在 readme 被成功地添加到了版本库中,并且修订版本号自动增加了1。

四、SVN 版本回退

当我们想放弃对文件的修改,可以使用 SVN revert 命令。

svn revert 操作将撤销任何文件或目录里的局部更改。

我们对文件 readme 进行修改,查看文件状态。

svn status

M       readme

这时我们发现修改错误,要撤销修改,通过 svn revert 文件 readme 回归到未修改状态。

svn revert readme 

Reverted 'readme'

再查看状态。

svn status

进行 revert 操作之后,readme 文件恢复了原始的状态。 revert 操作不单单可以使单个文件恢复原状, 而且可以使整个目录恢复原状。恢复目录用 -R 命令,如下。

svn revert -R trunk

但是,假如我们想恢复一个已经提交的版本怎么办。

为了消除一个旧版本,我们必须撤销旧版本里的所有更改然后提交一个新版本。这种操作叫做 reverse merge。

首先,找到仓库的当前版本,现在是版本 22,我们要撤销回之前的版本,比如版本 21。

svn merge -r 22:21 readme

五、SVN 查看历史信息

通过svn命令可以根据时间或修订号去除过去的版本,或者某一版本所做的具体的修改。以下四个命令可以用来查看svn 的历史:

  • svn log: 用来展示svn 的版本作者、日期、路径等等。

  • svn diff: 用来显示特定修改的行级详细信息。

  • svn cat: 取得在特定版本的某文件显示在当前屏幕。

  • svn list: 显示一个目录或某一版本存在的文件。

①、svn log

可以显示所有的信息,如果只希望查看特定的某两个版本之间的信息,可以使用:

svn log -r 6:8

如果只想查看某一个文件的版本修改信息,可以使用 svn log 文件路径。

svn log trunk/HelloWorld.html

如果希望得到目录的信息要加 -v。

如果希望显示限定N条记录的目录信息,使用 svn log -l N -v。

svn log -l 5 -v

②、svn diff

用来检查历史修改的详情。

  • 检查本地修改

  • 比较工作拷贝与版本库

  • 比较版本库与版本库

A、如果用 svn diff,不带任何参数,它将会比较你的工作文件与缓存在 .svn 的"原始"拷贝。

svn diff

B、比较工作拷贝和版本库

比较你的工作拷贝和版本库中版本号为 3 的文件 rule.txt。

svn diff -r 3 rule.txt

C、比较版本库与版本库

通过 -r(revision) 传递两个通过冒号分开的版本号,这两个版本会进行比较。

比较 svn 工作版本中版本号2和3的这个文件的变化。

svn diff -r 2:3 rule.txt

③、svn cat

如果只是希望检查一个过去版本,不希望查看他们的区别,可使用svn cat

svn cat -r 版本号 rule.txt

这个命令会显示在该版本号下的该文件内容

④、svn list

svn list 可以在不下载文件到本地目录的情况下来察看目录中的文件:

svn list http://139.199.201.210/test

六、SVN分支

Branch 选项会给开发者创建出另外一条线路。当有人希望开发进程分开成两条不同的线路时,这个选项会非常有用。

比如项目 demo 下有两个小组,svn 下有一个 trunk 版。

由于客户需求突然变化,导致项目需要做较大改动,此时项目组决定由小组 1 继续完成原来正进行到一半的工作(某个模块),小组 2 进行新需求的开发。

那么此时,我们就可以为小组2建立一个分支,分支其实就是 trunk 版(主干线)的一个copy版,不过分支也是具有版本控制功能的,而且是和主干线相互独立的,当然,到最后我们可以通过(合并)功能,将分支合并到 trunk 上来,从而最后合并为一个项目。

我们在本地副本中创建一个 my_branch 分支。

ls

branches  tags  trunk

svn copy trunk/ branches/my_branch

A         branches/my_branch

查看状态:

svn status

A  +    branches/my_branch
A  +    branches/my_branch/HelloWorld.html
A  +    branches/my_branch/readme

提交新增的分支到版本库。

svn commit -m "add my_branch" 

Adding         branches/my_branch
Replacing      branches/my_branch/HelloWorld.html
Adding         branches/my_branch/readme

Committed revision 9.

接着我们就到 my_branch 分支进行开发,切换到分支路径并创建 index.html 文件。

cd branches/my_branch/

将 index.html 加入版本控制,并提交到版本库中。

svn status
?       index.html

svn add index.html 
A         index.html

svn commit -m "add index.html"
Adding         index.html
Transmitting file data .
Committed revision 10.

切换到 trunk,执行 svn update,然后将 my_branch 分支合并到 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 文件。

将合并好的 trunk 提交到版本库中。

svn commit -m "add index.html"

七、SVN 标签

版本管理系统支持 tag 选项,通过使用 tag 的概念,我们可以给某一个具体版本的代码一个更加有意义的名字。

Tags 即标签主要用于项目开发中的里程碑,比如开发到一定阶段可以单独一个版本作为发布等,它往往代表一个可以固定的完整的版本,这跟 VSS 中的 Tag 大致相同。

我们在本地工作副本创建一个 tag。

svn copy trunk/ tags/v1.0

A         tags/v1.0

上面的代码成功完成,新的目录将会被创建在 tags 目录下。

ls tags/
v1.0

ls tags/v1.0/
HelloWorld.html  readme

查看状态。

svn status
A  +    tags/v1.0

提交tag内容。

svn commit -m "tags v1.0"
阅读 319