资源描述
资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。
svn实验手册
kingkongmao@龙梦
.5.23
本实验手册使用一个本地的代码库操练日常的svn使用流程, 访问本地的库无须用户验证
目录
1.准备: 建立版本库( repos) 和本地工作拷贝( working copy)
2.本地更改与提交
3.查看历史
4.分支与合并
1.准备: 建立版本库( repos) 和本地工作拷贝( working copy)
1) 建立本地版本库
mkdir ~/expe
cd ~/expe
svnadmin create repos
在~/expe/repos建立了代码库
loongson@debian:~/expe$ ls repos/
conf dav db format hooks locks README.txt
2) 建立代码库的的基本目录结构
mkdir working_copy
cd working_copy
loongson@debian:~/expe/working_copy$ svn co file:///home/loongson/expe/repos .
取出修订版 0。
loongson@debian:~/expe/working_copy$ mkdir trunk branches tags
loongson@debian:~/expe/working_copy$ ls
branches tags trunk
loongson@debian:~/expe/working_copy$ svn add branches/ tags/ trunk/
A branches
A tags
A trunk
loongson@debian:~/expe/working_copy$ svn ci -m "svn common directory structure"
新增 branches
新增 tags
新增 trunk
提交后的修订版为 1。
3) svn info能够看到你的本地和哪个库相连以及当前版本
loongson@debian:~/expe/working_copy$ svn info
路径: .
地址(URL): file:///home/loongson/expe/repos
Repository Root: file:///home/loongson/expe/repos
档案库 UUID: 9c193024-16a0-4d5b-b53c-aaddca74e1cf
修订版: 0
节点种类: 目录
调度: 正常
最后修改的修订版: 0
最后修改的时间: -05-23 22:15:44 +0800 (三, 23 5月 )
2.本地更改与提交
基本步骤:
svn update( 查看别人有没有更新)
svn status ( 查看本地更改与版本管理的关系, 哪些文件将提交到版本库)
svn commit/svn ci ( 提交)
1)本地修改
我随便做了两个文件, 准备加到库里面, 作为本地修改的一个示例
loongson@Loongson:~/expe/workingcopy/trunk$ cat hello
hello word.
I am loongson, who are you.
loongson@Loongson:~/expe/workingcopy/trunk$ svn add hello
A hello
loongson@Loongson:~/expe/workingcopy/trunk$ cat README
why not read me????
loongson@Loongson:~/expe/workingcopy/trunk$ svn add README
A hello
svn add只修改本地内容, 并没有提交
2) 查看别人有没有更新
这个时候我准备提交(commit)我的更改了, 首先我会运行svn update查看别人是否对代码进行了修改
loongson@Loongson:~/expe/workingcopy$ svn up
于修订版 1。
up是update的简写, update的作用是把别人修改的代码先取到本地, 上面的结果是没有人进行了修改。
为什么要先up呢, 这是因为如果有冲突的话, 应该在本地解决冲突以后, 再进行commit, 事实上你能够直接svn ci(commit), 可是如果别人和你修改了同一个文件, svn也不会让你成功提交, 还是需要先进行本地的update。
3) 查看将要提交的内容
现在我已经能够commit了, 我先查看一下我需要commit什么, 基本的规则是: 一个patch应该一个的commit, 一个patch能够是特定的一个功能实现, 一个bug fix等。
loongson@Loongson:~/expe/workingcopy/trunk$ svn status
A 0 hello
A 0 README
状态于修订版: 1
svn status的作用还包括, 你可能有文件没有添加到版本管理中, 比如我下面做了个extra文件作为例子
loongson@debian:~/expe/working_copy/trunk$ touch extra
loongson@debian:~/expe/working_copy/trunk$ ls
extra
loongson@debian:~/expe/working_copy/trunk$ svn status
? extra
文件前面的?就表示没有加入到版本管理, 有些时候是可能的, 比如说生成的.o文件。可是这里extra是需要加入版本管理的, 因此需要执行svn add extra。
4) 真正的提交
详细查看一下更改的内容svn diff hello, svn diff README, 我发现这两个是无关的更改, 她们属于两个不同的patch, 应该单独提交
因此我提交了两次, 并指明提交的文件
loongson@Loongson:~/expe/workingcopy/trunk$ svn commit hello -m "add hello"
新增 hello
传输文件数据.
提交后的修订版为 2。
loongson@Loongson:~/expe/workingcopy/trunk$ svn commit README -m "add README"
新增 README
传输文件数据.
提交后的修订版为 3。
例子中的-m的内容也太过简单, 每次提交都应该有详细的comment, 特别是对bug的修复, 应该详细说明bug的产生原因, 修复的道理等
从上面看到, 应该勤commit, 不要等到修改了一大堆文件以后, 才想起来要commit。
3.查看历史
svn log
svn diff
经过上面的commit以后, 看看info
loongson@debian:~/expe/working_copy/trunk$ svn info
路径: .
地址(URL): file:///home/loongson/expe/repos/trunk
Repository Root: file:///home/loongson/expe/repos
修订版: 1
节点种类: 目录
调度: 正常
最后修改的作者: loongson
最后修改的修订版: 1
最后修改的时间: -05-23 22:23:05 +0800 (三, 23 5月 )
你能够发现虽然我们提交了两次, 版本已经增长到了3, 可是整个working copy的版本还是1, 因此为了看到完整的log, 需要执行
loongson@debian:~/expe/working_copy/trunk$ svn up
于修订版 3。
1)svn log
loongson@debian:~/expe/working_copy/trunk$ svn log
------------------------------------------------------------------------
r3 | loongson | -05-23 22:45:14 +0800 (三, 23 5月 ) | 1 line
add README
------------------------------------------------------------------------
r2 | loongson | -05-23 22:45:09 +0800 (三, 23 5月 ) | 1 line
add hello
------------------------------------------------------------------------
r1 | loongson | -05-23 22:23:05 +0800 (三, 23 5月 ) | 1 line
svn common directory structure
------------------------------------------------------------------------
或者看看每次提交更改了哪些文件
loongson@debian:~/expe/working_copy/trunk$ svn log -v
------------------------------------------------------------------------
r3 | loongson | -05-23 22:45:14 +0800 (三, 23 5月 ) | 1 line
改变的路径:
A /trunk/README
add README
------------------------------------------------------------------------
r2 | loongson | -05-23 22:45:09 +0800 (三, 23 5月 ) | 1 line
改变的路径:
A /trunk/hello
add hello
------------------------------------------------------------------------
r1 | loongson | -05-23 22:23:05 +0800 (三, 23 5月 ) | 1 line
改变的路径:
A /branches
A /tags
A /trunk
svn common directory structure
------------------------------------------------------------------------
2) svn diff
能够是用svn diff命令查看版本之间的差异, 比如我想知道r2具体发生了哪些更改
loongson@debian:~/expe/working_copy/trunk$ svn diff -r 1:2
Index: hello
===================================================================
--- hello ( 修订版 0)
+++ hello ( 修订版 2)
@@ -0,0 +1,2 @@
+hello word.
+I am loongson, who are you.
这是标准的patch格式, 表示hello这个文件在版本0, 从0行到0行发生了如下的删除动作( 其实没有删除) , 在1行到2行发生了如下的增加( 就是增加了加号的那两行)
4.分支与合并, 解决冲突
分支就是在另外一个地方管理代码的版本, 而不影响主线( trunk) 的代码。分支的原因有很多, 第一次使用svn都希望建立一个分支, 然后在自己的分支上工作, 相当于自己的独立的工作空间, 这种工作方式没有错, 可是svn支持并不是很好, 需要编写comment的时候记录下每次合并代码的版本号, 因此我认为当前分支最佳的实践是为某个工作目的创立一个分支, 功能实现以后马上在trunk中合并这个内容, 分支的使命完成后就能够删除了。
分支其实很简单, 就是copy一下
loongson@Loongson:~/expe/workingcopy/trunk$ svn copy file:///home/loongson/expe/repos/trunk file:///home/loongson/expe/repos/branches/hi
提交后的修订版为 4。
现在你能够选择把那个hi分支check out出来修改, 这样子很简单直接, 也能够把本地switch过去, 省一点网络带宽
loongson@Loongson:~/expe/workingcopy/trunk$ svn info | grep URL
地址(URL): file:///home/loongson/expe/repos/trunk
loongson@Loongson:~/expe/workingcopy/trunk$ svn switch file:///home/loongson/expe/repos/branches/hi
于修订版 4。
loongson@Loongson:~/expe/workingcopy/trunk$ svn info | grep URL
地址(URL): file:///home/loongson/expe/repos/branches/hi
这个时候你本地的working copy已经和新的URL发生联系了, 所有的commit都朝向新的URL
ok现在我开始修改, 就是把hello换成hi。
loongson@Loongson:~/expe/workingcopy/trunk$ cat hello
hi word.
I am loongson, who are you.
可是我发现我错了, 其实我是想加一行hi, 我觉得我改了太多了太乱了, 索性恢复到我checkout时候的版本
loongson@Loongson:~/expe/workingcopy/trunk$ svn revert hello
已恢复”hello”
我加了一行以后重新commit
loongson@Loongson:~/expe/workingcopy/trunk$ cat hello
hello world.
hi world, heihei~~~
I am loongson, who are you.
loongson@Loongson:~/expe/workingcopy/trunk$ svn ci hello
正在发送 hello
传输文件数据.
提交后的修订版为 5。
这个时候我转回去, 开始合并
loongson@Loongson:~/expe/workingcopy/trunk$ svn switch file:///home/loongson/expe/repos/trunk
U hello
更新至修订版 5。
loongson@Loongson:~/expe/workingcopy/trunk$ cat hello
hello word.
I am loongson, who are you.
当然我不急于合并, 我添加一个文件模拟主线依然进行着有序的开发
loongson@Loongson:~/expe/workingcopy/trunk$ vim accessory
loongson@Loongson:~/expe/workingcopy/trunk$ svn add accessory
A accessory
loongson@Loongson:~/expe/workingcopy/trunk$ svn ci -m "add accessory"
新增 accessory
传输文件数据.
提交后的修订版为 6。
OK, 开始合并
合并的过程一开始比较难理解, 其实简单的说就是把分支上面两个版本之间所作的修改作为一个patch, 然后应用到你的本地上面
记住你比较的是分支的两个版本, 比如说分支开发是从r10到r20, 执行svn merge的效果相当于把r20到r10两个版本树做一个diff -urN生成一个patch, 然后执行patch -p1命令。问题是怎么找出这两个版本呢?
首先我们找出我们是从那个版本开始分支的
loongson@Loongson:~/expe/workingcopy$ svn log --stop-on-copy file:///home/loongson/expe/repos/branches/hi
------------------------------------------------------------------------
r5 | loongson | -01-02 11:52:56 +0800 (二, 02 1月 ) | 2 lines
add hi
------------------------------------------------------------------------
r4 | loongson | -01-02 11:43:08 +0800 (二, 02 1月 ) | 4 lines
hello to hi
------------------------------------------------------------------------
也就是说我们从r4开始我们的分支, 到r5完成, 因此我们执行
loongson@Loongson:~/expe/workingcopy$ svn merge -r 4:5 file:///home/loongson/expe/repos/branches/hi
U hello
loongson@Loongson:~/expe/workingcopy$ cat hello
hello world.
hi world, heihei~~~
I am loongson, who are you.
完成了合并, 注意所有的更改都在本地, 应该提交一次, 而且要记录合并的版本
loongson@Loongson:~/expe/workingcopy$ svn ci -m "merge file:///home/loongson/expe/repos/branches/hi -r 4:5"
正在发送 hello
传输文件数据.
提交后的修订版为 7。
如果hi分支依然继续开发, 请注意下次合并应该从r5开始, 避免合并重复的内容
建SVN 版本库
-05-19 14:31
svn 服务器: Setup-Subversion-1.6.2.msi
svn 客户端: TortoiseSVN-1.6.3.16613-win32-svn-1.6.3.msi
装完两个软件且重启, 没有配置svn服务器任何文件得情况下:
在E盘根目录下建立svn
运行 svnadmin create E:\svn\test test版本库建立成功
之后 启动svn服务器 svnserve.exe --daemon,
之后 使用TortoiseSVN -> Repo-browser 来查看版本库。在弹出的 URL 对话框中输入: svn://localhost/svn/test
svn建立一个本地版本库
-12-27 15:51
软件需求:
客户端: TortoiseSVN-1.4.6.11647-win32-svn-1.4.6
建立过程:
1、 安装客户端软件即可。
2、 先建立一个版本库根目录文件夹如: svnRespoistory
3、 然后在根目录里, 建立对应项目的版本库。
在目录E:\svnRespoistory\repository下"右键->TortoiseSVN->Create Repository here...", 选择版本库模式, 这里使用默认即可, 然后就创立了一系列目录和文件。
4、 来到项目根目录, 进行初始化导入。
右键->TortoiseSVN->Import...
在URL of repository输入"file///E:/svnRespoistory/repository"
注: 在这个过程中, 并不会把导入的文件复制到版本库中, 而只是将内容导入到版本库中。此时, 这个源文件是能够删除了。
5、 基本客户端操作, 取出版本库中的一个工作拷贝。
运行右键->Checkout
在URL of repository中输入:file///E:/subRespoistory/repository, 这样我们就得到了一份工作拷贝。
注: 同样我们在这里提交的修改也就是版本库根据情况来进行相应的存储。并不会在复制文件到导入的地方或到版本库这个文件夹里。
6、 配置用户和权限
在版本库根目录里的conf/svnserve.conf
# password-db = passwd (去掉#)
同样修改该目录下的passwd文件
增加一个用户帐号如 test = test
参考:
SVN的个人本地版本库的使用方法
-01-24 13:04
1 下载和安装:
下载一个安装版和一个简体中文包2个安装包, 并安装之。
2 建立版本库目录( Project's DataBase Folder)
2.1 在你的重要资料的分区新建一个目录叫”SVNDB”
2.2 在这个目录里面再建立一个属于你的某个工程的子目录例如”Project1”, 假如你有多个工程, 则建立几个
2.3 在”Project1”的资源管理器的目录树右键菜单”tortoisesvn”->”在此创立版本库”
2.4 新建版本库后, 再在此目录按右键菜单找到”版本库浏览器”, 在版本库浏览器里, 把URL里面的地址( 例如”file:///E:/SVNDB/Project1”) 复制( 备用)
3 将现有工程的目录和文件导入版本库( Exists Project's Source Temp Folder)
3.1 将你的现有工程的目录复制到一个临时的目录( 例如C:\Project1) , 将里面的不需要加入版本库的文件或目录清理好
3.2 在2.4的那个版本库浏览器里, 右键, 加入文件夹C:\Project1( 加入完成后, C:\Project1这个目录就能够彻底删除了)
3.3 版本库在浏览器里右键把Project1改名为trunk
4 建立日常使用的工作目录( Project's Workspace Folder)
4.1 在你的日常使用的目录中建立一个文件夹( 例如: E:\Project1)
4.2 资源管理器的目录树中, 在E:\Project1右键菜单点击”SVN 检出”
4.3 在”SVN 检出”的对话框中, URL地址里面填”file:///E:/SVNDB/Project1/trunk”( 最好有后面的trunk)
4.4 检出完成后, 此目录里面就填充满工程的文件和目录了, 那么日后编辑或开发代码就在此目录里面工作了。
其它说明:
·日后写了部分代码, 觉得需要备份时就”SVN 提交”, 过了些时间要刷新一下就”SVN 更新”
·Windows的资源管理器的右键菜单在工作目录里面有点不太正常, 能够换其它的资源管理器( 例如: Q-Dir/FreeCmd/MDIE/TotalCmd等)
·在SVN中最重要的目录: DataBase Folder , 此文件夹其实就是个备份的数据库, 把工程的目录和文件都用zip压缩在此目录里面( 能够观察一下此目录下文件的更改)
·如果要撤销某个工程使用的SVN, 则在资源管理器删除DataBase Folder和Workspace Folder即可。
补充几个目录的说明:
trunk -- 主干日常开发
branches -- 新分支做定制
tags -- 历届版本存档
展开阅读全文