铁道部建设管理司网站,nginx网站建设,四川超宇建设集团网站,做微信的微网站SVN#xff08;Subversion#xff09;是一种集中式版本控制系统#xff0c;它有一个中央仓库用于存储代码库的完整历史记录。相对于分布式版本控制系统#xff08;例如 Git#xff09;#xff0c;SVN 不支持本地仓库。
一、SVN 安装。 #xff08;1#xff09;在windo…SVNSubversion是一种集中式版本控制系统它有一个中央仓库用于存储代码库的完整历史记录。相对于分布式版本控制系统例如 GitSVN 不支持本地仓库。
一、SVN 安装。 1在windows下安装 SVN 1、准备svn的安装文件 下载地址Subversion for Windows download | SourceForge.net 2、下载完成后在相应的盘符中会有一个Setup-Subversion-1.8.16.msi的文件目前最新的版本是1.8.16 这里就使用这个版本。然后双击安装文件进行安装。我们指定安装在D:\Program Files (x86)\Subversion目录里。 3、查看目录结构 把svn安装目录里的bin目录添加到path路径中在命令行窗口中输入 svnserve --help ,查看安装正常与否。 至此windows下的SVN安装完成 2在CentOS下安装 SVN 大多数 GNU/Linux 发行版系统自带了Subversion 所以它很有可能已经安装在你的系统上了。可以使用下面命令检查是否安装了。 svn --version 如果 Subversion 客户端没有安装命令将报告svn命令找不到的错误。 [runoobcentos6 ~]$ svn --version
bash: svn: command not found 我们可以使用 yum install subversion 命令进行安装。 [runoobcentos6 root]$ su -
密码
[rootcentos6 ~]# yum install subversion
已加载插件fastestmirror, security
设置安装进程
Loading mirror speeds from cached hostfile* base: mirrors.aliyun.com* epel: mirrors.neusoft.edu.cn* extras: mirrors.zju.edu.cn* updates: mirrors.aliyun.com
解决依赖关系
--gt; 执行事务检查
... 安装成功之后执行 svn --version 命令。 [rootcentos6 ~]# svn --version
svn版本 1.6.11 (r934486)编译于 Aug 17 201508:37:43 至此centos下的SVN安装完成。 3在Ubuntu下安装 SVN 如果 Subversion 客户端没有安装命令将报告svn命令找不到的错误。 rootrunoob:~# svn --version
The program svn is currently not installed. You can install it by typing:
apt-get install subversion 我们可以使用 apt-get 命令进行安装 rootrunoob:~# apt-get install subversion
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:augeas-lenses hiera libaugeas0 libxslt1.1 ruby-augeas ruby-deep-merge ruby-json ruby-nokogiri ruby-rgen ruby-safe-yaml ruby-selinux ruby-shadow
Use apt-get autoremove to remove them.
The following extra packages will be installed:libserf-1-1 libsvn1
... 安装成功之后执行 svn --version 命令。 rootrunoob:~# svn --version
svn, version 1.8.13 (r1667537)compiled Sep 8 2015, 14:59:01 on x86_64-pc-linux-gnu 至此Ubuntu下的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 启动模式两种启动方式。 首先,在服务端进行SVN版本库的相关配置 手动新建版本库目录这里只是创建新的目录跟svn没啥关系 mkdir /opt/svn
或者直接创建好版本库的目录也是可以的
mkdir /opt/svn/runoob 利用svn命令创建版本库 svnadmin create /opt/svn/runoob 使用命令svnserve启动服务 svnserve -d -r 目录 --listen-port 端口号 由于-r 配置方式的不一样SVN启动就可以有两种不同的访问方式 方式一-r直接指定到版本库(称之为单库svnserve方式) svnserve -d -r /opt/svn/runoob 在这种情况下一个svnserve只能为一个版本库工作。 authz配置文件中对版本库权限的配置应这样写 [groups]
adminuser1
devuser2
[/]
adminrw
user2r 使用类似这样的URLsvn://192.168.0.1/ 即可访问runoob版本库 方式二指定到版本库的上级目录(称之为多库svnserve方式) svnserve -d -r /opt/svn 这种情况一个svnserve可以为多个版本库工作 authz配置文件中对版本库权限的配置应这样写 [groups]
adminuser1
devuser2
[runoob:/]
adminrw
user2r[runoob01:/]
adminrw
user2r 如果此时你还用[/]则表示所有库的根目录同理[/src]表示所有库的根目录下的src目录。 使用类似这样的URLsvn://192.168.0.1/runoob 即可访问runoob版本库。 -r: 配置方式决定了版本库访问方式。 --listen-port: 指定SVN监听端口不加此参数SVN默认监听3690 四、SVN 创建版本库。
1创建版本库。 使用 svn 命令创建资源库 [runoobcentos6 ~]# svnadmin create /opt/svn/runoob01
[runoobcentos6 ~]# 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.conf svn 服务配置文件为版本库目录中的文件 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 表示无访问权限默认值read。 auth-access: 控制鉴权用户访问版本库的权限。取值范围为 write、read 和 none。 即write为可读可写read为只读none表示无访问权限默认值write。 authz-db: 指定权限配置文件名通过该文件可以实现以路径为基础的访问控制。 除非指定绝对路径否则文件位置为相对conf目录的相对路径默认值authz。 realm: 指定版本库的认证域即在登录时提示的认证域名称。若两个版本库的认证域相同建议使用相同的用户名口令数据文件。默认值一个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所以 URLsvn://192.168.0.1/runoob01。 2服务端配置svnserve.confi、password、authz文件。
这几个文件初始状态都是注释的需要把注释删除前面的空格也要删除。 修改 SVN 的配置文件需要按照特定的格式进行编辑。下面是对每个配置文件的简单说明以及如何进行修改的步骤 svnserve.conf 打开 svnserve.conf 文件一般位于 SVN 服务器的存储目录下。寻找并修改以下常见配置项 anon-access指定匿名用户的访问权限可以设置为 none禁止匿名访问或 read只读访问。auth-access指定授权用户的访问权限可以设置为 write可写访问或 read只读访问。password-db指定 passwd 文件的路径确保该路径与实际的 passwd 文件相对应。authz-db指定 authz 文件的路径确保该路径与实际的 authz 文件相对应。realm指定认证域的名称可以根据需要进行修改。保存并关闭文件。 passwd 打开 passwd 文件一般位于 SVN 服务器的存储目录下。按照以下格式添加用户的认证信息[users] username password 其中username 是要添加的用户名password 是该用户的密码。你可以根据需要添加多个用户的认证信息。保存并关闭文件。 authz 打开 authz 文件一般位于 SVN 服务器的存储目录下。按照以下格式定义用户对不同路径的访问权限 [groups]
admin alice, bob
developers charlie, david[/]
admin rw [projectA:/]
developers rw
alice r [projectB:/]
developers rw
bob r 在这个示例中我们定义了两个用户组admin 和 developers。/ 表示根路径projectA 和 projectB 是具体的项目路径。admin 组拥有对根路径的读写权限developers 组以及 alice 和 bob 用户对各自项目路径有读写和只读权限。保存并关闭文件。 在修改完配置文件后重启 SVN 服务器以使更改生效。请务必谨慎修改这些文件并确保你对配置项的修改与你的安全和访问需求相符合。 3报错解决。 报错如下 或者 解决方法 都是因为修改svnserve.conf或者authz或者password文件时打开注释时配置的前面有空格修改后即可。 4svnserve.conf、authz、password文件内容本次学习所修改的配置。 svnserve.conf文件 [general]
anon-access none
auth-access write
password-db passwd
authz-db authz
# groups-db groups
realm My First Repository
# force-username-case none
# hooks-env hooks-env
[sasl]
# use-sasl true
# min-encryption 0
# max-encryption 256 authz文件 [aliases]
# joe /CXZ/STDessert/LSnake City/OSnake Oil, Ltd./OUResearch Institute/CNJoe Average[groups]
admin admin,tan
[/]
admin rw
[runoob:/]
admin rw password文件 [users]
admin admin
tan 123 五、SVN的基础操作。
1SVN 检出操作。 下面是还没人提交文件到版本库所以检出的只有一个空版本库目录。 下面的是我已经提交一些文件到版本库了所以再次检出是有文件的。 所有的文件是指提交的那些文件。 SVN 检出操作 上一章中我们创建了版本库runoob01,URL为svn://192.168.0.1/runoob01,svn用户user01有读写权限。 我们就可以通过这个URL在客户端对版本库进行检出操作。 svn checkout http://svn.server.com/svn/project_repo --usernameuser01 以上命令将产生如下结果 rootrunoob:~/svn# svn checkout svn://192.168.0.1/runoob01 --usernameuser01
A runoob01/trunk
A runoob01/branches
A runoob01/tags
Checked out revision 1. 检出成功后在当前目录下生成runoob01副本目录。查看检出的内容 rootrunoob:~/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 命令。 2 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.runoob.com/。 rootrunoob:~/svn/runoob01/trunk# cat HelloWorld.html
HelloWorld! http://www.runoob.com/ 用下面的命令查看更改 rootrunoob:~/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/! 尝试使用下面的命令来提交他的更改 rootrunoob:~/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 命令如下 rootrunoob:~/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 此时工作副本是和仓库已经同步可以安全地提交更改了 rootrunoob:~/svn/runoob01/trunk# svn commit -m change HelloWorld.html second
Sending HelloWorld.html
Transmitting file data .
Committed revision 7. 3SVN 提交操作。 在上一章中我们检出了版本库runoob01对应的目录放在/home/user01/runoob01中下面我们针对这个库进行版本控制。 我们在库本版中需要增加一个readme的说明文件。 rootrunoob:~/svn/runoob01/trunk# cat readme
this is SVN tutorial. 查看工作副本中的状态。 rootrunoob:~/svn/runoob01/trunk# svn status
? readme 此时 readme的状态为说明它还未加到版本控制中。 将文件readme加到版本控制等待提交到版本库。 rootrunoob:~/svn/runoob01/trunk# svn add readme
A readme 查看工作副本中的状态 rootrunoob:~/svn/runoob01/trunk# svn status
A readme 此时 readme的状态为A,它意味着这个文件已经被成功地添加到了版本控制中。 为了把 readme 存储到版本库中使用 commit -m 加上注释信息来提交。 如果你忽略了 -m 选项 SVN会打开一个可以输入多行的文本编辑器来让你输入提交信息。 rootrunoob:~/svn/runoob01/trunk# svn commit -m SVN readme.
Adding readme
Transmitting file data .
Committed revision 8.
svn commit -m SVN readme. 4SVN 版本回退。 svn revert readme命令用于撤销对文件或目录的修改恢复到最新版本的状态。具体来说svn revert readme将读取最新版本的readme文件内容并将其恢复到工作副本中覆盖当前所有的修改。这样可以丢弃本地的修改还原到最新的代码状态。 当我们想放弃对文件的修改可以使用 SVN revert 命令。 svn revert 操作将撤销任何文件或目录里的局部更改。 我们对文件 readme 进行修改,查看文件状态。 rootrunoob:~/svn/runoob01/trunk# svn status
M readme 这时我们发现修改错误要撤销修改通过 svn revert 文件 readme 回归到未修改状态。 rootrunoob:~/svn/runoob01/trunk# svn revert readme
Reverted readme 再查看状态。 rootrunoob:~/svn/runoob01/trunk# svn status
rootrunoob:~/svn/runoob01/trunk# 进行 revert 操作之后readme 文件恢复了原始的状态。 revert 操作不单单可以使单个文件恢复原状 而且可以使整个目录恢复原状。恢复目录用 -R 命令如下。 svn revert -R trunk 但是假如我们想恢复一个已经提交的版本怎么办。 为了消除一个旧版本我们必须撤销旧版本里的所有更改然后提交一个新版本。这种操作叫做 reverse merge。 首先找到仓库的当前版本现在是版本 22我们要撤销回之前的版本比如版本 21。 svn merge -r 22:21 readme 5SVN 查看历史信息。 通过svn命令可以根据时间或修订号去除过去的版本或者某一版本所做的具体的修改。以下四个命令可以用来查看svn 的历史 svn log: 用来展示svn 的版本作者、日期、路径等等。 svn diff: 用来显示特定修改的行级详细信息。 svn cat: 取得在特定版本的某文件显示在当前屏幕。 svn list: 显示一个目录或某一版本存在的文件。 1svn log 可以显示所有的信息如果只希望查看特定的某两个版本之间的信息可以使用 rootrunoob:~/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 文件路径。 rootrunoob:~/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。 rootrunoob:~/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
------------------------------------------------------------------------ 2svn diff 用来检查历史修改的详情。 检查本地修改比较工作拷贝与版本库比较版本库与版本库 1、如果用 svn diff不带任何参数它将会比较你的工作文件与缓存在 .svn 的原始拷贝。 rootrunoob:~/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 3svn cat 如果只是希望检查一个过去版本不希望查看他们的区别可使用svn cat svn cat -r 版本号 rule.txt 这个命令会显示在该版本号下的该文件内容 4svn list svn list 可以在不下载文件到本地目录的情况下来察看目录中的文件 $ svn list http://192.168.0.1/runoob01
README
branches/
clients/
tags/ 5SVN分支。 Branch 选项会给开发者创建出另外一条线路。当有人希望开发进程分开成两条不同的线路时这个选项会非常有用。 比如项目 demo 下有两个小组svn 下有一个 trunk 版。 由于客户需求突然变化导致项目需要做较大改动此时项目组决定由小组 1 继续完成原来正进行到一半的工作某个模块小组 2 进行新需求的开发。 那么此时我们就可以为小组2建立一个分支分支其实就是 trunk 版主干线的一个copy版不过分支也是具有版本控制功能的而且是和主干线相互独立的当然到最后我们可以通过合并功能将分支合并到 trunk 上来从而最后合并为一个项目。 我们在本地副本中创建一个 my_branch 分支。 rootrunoob:~/svn/runoob01# ls
branches tags trunk
rootrunoob:~/svn/runoob01# svn copy trunk/ branches/my_branch
A branches/my_branch
rootrunoob:~/svn/runoob01# 查看状态 rootrunoob:~/svn/runoob01# svn status
A branches/my_branch
A branches/my_branch/HelloWorld.html
A branches/my_branch/readme 提交新增的分支到版本库。 rootrunoob:~/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 文件。 rootrunoob:~/svn/runoob01# cd branches/my_branch/
rootrunoob:~/svn/runoob01/branches/my_branch# ls
HelloWorld.html index.html readme 将 index.html 加入版本控制并提交到版本库中。 rootrunoob:~/svn/runoob01/branches/my_branch# svn status
? index.html
rootrunoob:~/svn/runoob01/branches/my_branch# svn add index.html
A index.html
rootrunoob:~/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 中。 rootrunoob:~/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 文件。 rootrunoob:~/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 提交到版本库中。 rootrunoob:~/svn/runoob01/trunk# svn commit -m add index.html
Adding index.html
Transmitting file data .
Committed revision 11. 6SVN 标签tag。 版本管理系统支持 tag 选项通过使用 tag 的概念我们可以给某一个具体版本的代码一个更加有意义的名字。 Tags 即标签主要用于项目开发中的里程碑比如开发到一定阶段可以单独一个版本作为发布等它往往代表一个可以固定的完整的版本这跟 VSS 中的 Tag 大致相同。 我们在本地工作副本创建一个 tag。 rootrunoob:~/svn/runoob01# svn copy trunk/ tags/v1.0
A tags/v1.0 上面的代码成功完成新的目录将会被创建在 tags 目录下。 rootrunoob:~/svn/runoob01# ls tags/
v1.0
rootrunoob:~/svn/runoob01# ls tags/v1.0/
HelloWorld.html readme 查看状态。 rootrunoob:~/svn/runoob01# svn status
A tags/v1.0 提交tag内容。 rootrunoob:~/svn/runoob01# svn commit -m tags v1.0
Adding tags/v1.0
Transmitting file data ..
Committed revision 14. 7TortoiseSVN 使用教程。 TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端可以超越时间的管理文件和目录。 1TortoiseSVN 安装 下载地址https://tortoisesvn.net/downloads.html, 页面里有语言包补丁的下载链接。 目前最新版为 1.11.0 下载地址 https://osdn.net/projects/tortoisesvn/storage/1.11.0/ 在语言补丁包中我们可以找到中文的补丁并下载下来 运行下载的 TortoiseSVN 安装程序 运行下载的 TortoiseSVN 中文语言包 正确安装后应该进行一次的重开机以确保 TortoiseSVN 的正确无误。 修改 TortoiseSVN 默认语言 TortoiseSVN 安装完后默认的界面是英文的我们可以通过设置修改成已安装语言 2TortoiseSVN 的使用 建立一个 runoob01 的工作目录 所谓的 runoob01 目录其实就是您平常用来存放工作档案的地方。通常我们会等到自己的工作做的一个段落的时候再进行备份。所以我们平常都是在 runoob01 目录下面工作等到适当时机在 commit 到 repository 中。举例来说我们想在 D 盘下面建立一个名为 runoob01 的目录。首先先把这个目录建立出来。 进入创建的目录在空白处按下右键后(您可以在 MyWork 目录的 icon 上按也可进入 MyWork 目录后在空白的地方按)选择 SVN checkout。 接着您可以看到如下的画面 首先我们要填入的是 repository(版本库)的位置对于 SVN 来说repository 的位置都是 URL。版本库 URL 这里填入我们测试的版本仓库地址 svn://10.0.4.17/runoob01。 接着稍微看一下 Checkout directory(检出至目录)这个字段应该要指向您的 runoob01 目录。 确认后按下 OK 按钮您应该可以看到如下的信息窗口。 这样就表示动作完成。按下 OK 按钮后再到您刚刚建立的目录下。您将会看到 MyWork 目录下面多了一个名为 .svn 的目录(这个目录是隐藏的如果您的档案管理员没有设定可以看到隐藏目录您将无法看到它) 。 如果您要在一个已经存在的 SVN Server 上面 checkout 出上面的档案您只需要给定正确的 SVN URL 以及要 checkout 目录的名称。就可以取得指定的档案及目录了。 3新增档案及目录到 Repository 中 add commit 创建目录 dir01, 在目录里新增文件 将新增的文件加入到 SVN 版本控制中TortoiseSVN 会把准备要加入的档案及目录勾选需要加入的文件。 按下 OK 后您将会看到如下的讯息窗口 这个 Add(增加)的动作并未真正的将档案放到 Repository 中。仅仅是告知 SVN 准备要在 Repository 中放入这些档案。 此时的文件状态为 这些档案真正的放入到 Repository 中空白处右键选择 SVN commit(提交) 紧接着您将会看到如下的窗口出现 在这里可以清楚地了解到哪些档案要被 commit 到 repository版本库中。同样的如果您有档案不想在这个时候 commit 到 Repository您可以取消选取的档案这样他们就不会被 commit 到 Repository 中。在信息文本框中可以写入对本次 commit 的说明。 点击确认后完成 commit 动作然后您可以到 runoob 目录中确定是否所有的档案 icon 都有如下的绿色勾勾在上面这样代表您的档案都正确无误的到 repository 中。 4更新档案及目录 update 由于版本控制系统多半都是由许多人共同使用。所以同样的档案可能还有人会去进行编辑。为了确保您工作目录中的档案与 Repository 中的档案是同步的。建议您在编辑前都先进行更新的动作。 在想要更新的档案或目录 icon 上面按下鼠标右键。并且选择 SVN Update。 有时我们需要回溯至特定的日期或是版本这时就可以利用 SVN 的 Update to revision 的功能。在想要更新的档案或目录 icon 上面按下鼠标右键。并且选择 TortoiseSVN-Update to revision(更新至版本)。 5复制档案及目录 branch 很多时候您会希望有另外一个复制的目录来进行新的编修。等到确定这个分支的修改已经完毕了再合并到原来的主要开发版本上。举例来说我们目前在runoob01/trunk下面有如下的目录及档案 现在我们要为 trunk 这个目录建立一个 branch。假设我们希望这个目录是在 D:\runoob01\branch。首先我们可以在 trunk 目录下面的空白处或是直接在 trunk 的 icon 下面按下鼠标右键选择 Branch/Tag…(分支/标记)这个选项您将会看到如下的对话框出现。 请先确认 From WC at URL(从工作副本/URL): 中的目录是您要复制的来源目录。接着在 To URL(至路径)中输入您要复制过去的路径。通常我们会将所有的 branch 集中在一个目录下面。以上面的例子来说branch 档案都会集中在 branch 的子目录下面。在 To URL 中您只需要输入您要的目录即可。目录不存在时会由 SVN 帮您建立。特别需要注意的是 SVN 以斜线作为目录分隔字符而非反斜线。 接着在 Log message(日志信息)输入您此次 branch 的目的为何。按下 OK 就可以了。 如果成功将可以看到下面的画面 按下 OK 就可以关闭这个窗口了。如果您此时立刻去 runoob01 目录的 branch 子目录下面您将会失望的发现在该目录下面并没有刚刚指定的目录存在。这是因为您 runoob01 目录的部份还是旧的您只需要在 branch 子目录下面进行 SVN update 就可以看到这个新增的目录了。新增的目录就与原来的目录无关了。您可以任意对他进行编辑一直到您确认好所有在 branch 下面该做的工作都完成后您可以选择将这个 branch merge 回原来的 trunk 目录或者是保留它在 branch 中。 6合并动作 merge 假如我们在 branch 分支中对文件进行了修改或增加了文件要 merge 回 trunk 目录中方法很简单。以上面的例子来说我们在 D:\runoob01\trunk目录空白处按下鼠标右键选择 Merge(合并): 这个画面主要分为三个部份前面的 From: 与 To: 是要问您打算从 Branch 中的哪个版本到哪个版本merge 回原来的 trunk 目录中。因此From 跟 To 的 URL 字段应当都是指定原来 branch 的目录下。剩下的就是指定要 merge 的 revision 范围。以上面的例子而言我们从 Branch 的 Revision 7 开始 merge 到 Branch 下面的最新版本。您可以透过Try run 按钮试作一次 Merge。这个 merge 只会显示一些讯息不会真正的更新到 trunk 的目录去。只有按下 Merge 按钮后才会真正的将 branch 的档案与 trunk 的档案合并起来。 如果您确认这次的 merge 没有问题您可以直接使用 commit 来将这两个被修改的档案 commit 回 SVN repository 上。如果有问题您可以直接修改这两个档案直到确认 ok 了再行 commit。 7制作 Tag 或是 Release 所谓的 Tag 或是 Release 就是一个特别的版本因为这个版本可能有特别的意义。例如这个版本是特别的 Milestone 或是 release 给客户的版本。其实Tag 与 Release 的作法与 Branch 完全相同。只是 Branch 可能会需要 merge 回原来的 trunk 中而 tag 及 release 大部分都不需要 merge 回 trunk 中。 举例来说今天我们的 trunk 做了一版这个版本被认定是软件的 1.0 版。 1.0版对于开发来说是一个非常重要的里程碑。所以我们要特别为他做一个标记亦即 Tag。假设这个 1.0 版是要正式 release 给客户或是相关 vendor我们要可以为他做一个 Release 的标记。基本上SVN 只有目录的概念并没有什么 Tag 的用法。所以您会看到在 SVN 的选单上面Branch 与 Tag 是同一个项目。以这个 1.0 的例子来说我们在 runoob01 目录下创建 tags 目录用于存放打 tag 的版本并提交到版本库然后在 Trunk 上面按下鼠标右键选择 Branch/Tag 的项目 成功的话您就在对应的 Tag 目录下面建立了一个 v1.0 的目录。当然如果您这时到 Tag 的目录下面去会看不到这个目录您需要在 Tag 目录下面 update 一下才能看到它。 六、TortoiseSVN和SVN托管服务平台的基本操作。
安装好ortoiseSVN客户端软件。
1在SVN托管服务网站创建一个项目。
https://svnbucket.com/ 是一个 SVN 托管服务网站。类似于 GitHub 或 Bitbucket。 登录SVNBucket - SVN仓库免费 SVN 代码托管服务器不限私有不限成员 网站然后创建一个项目复制svn地址。 2svn checkout 检出操作。 找好一个目录后进去右击鼠标。 之后会弹出下面的窗口页面 然后会弹出这个窗口 3svn commit 提交。 4svn update 更新拉取最新版本。 如果 SVN 的版本库升级了而你的工作副本也修改了一些内容当你执行 SVN 更新操作时SVN 会尝试将版本库中的最新代码与你的工作副本合并。如果版本库中的更新与你的修改发生冲突即在相同的文件的相同位置进行了修改你需要手动解决这些合并冲突通常的做法是打开冲突的文件手动编辑并选择保留哪些修改。 基本上更上面的操作差不多这个是把版本库的最新版更新到本地工作副本。 5显示日志查看历史提交记录。 6撤销和恢复。
1撤销本地修改。 就是撤销还没提交的内容把它恢复到上一次提交或更新后的状态。 2撤销已提交内容回退到指定版本号的前一个版本号模样。 这里我们选的是版本号2即复原了版本号2所做的一切就是说工作副本变成了版本号1。 3恢复到指定版本。 需要重新提交版本库才能跟工作副本同步。 7查看修改前后差异。 只要是点击TortoiseSVN功能弹出的窗口中有文件双击它就有该功能比如查看日志窗口 8添加忽略。 如果之前提交的有符合忽略规则的文件再次提交后版本库会把它们删除掉。 9解决冲突。 注意二进制是无法进行合并的所以不要多个人同时操作。 发生冲突后选择冲突那行右键选择解决方案。 10