前言: 软件不能完全解决因沟通造成的问题。
什么是 svn
subversion的版本库是一种文件服务器,它记录每一次改变,每个文件的改变,甚至是目录树本身的改变,例如文件和目录的添加、删除和重新组织。一般情况下,客户端从版本库中获取的数据是文件系统树中的最新数据。但是客户端也具备查看文件系统树以前任何一个状态的能力。举个例子,客户端有时会对一些历史性问题感兴趣,比如“上星期三时的目录结构是什么样的?”或者“谁最后一个修改了这个文件,都修改了什么?”这些都是版本控制系统的核心问题:设计用来记录和跟踪数据变化的系统。
总而言之,svn实现了代码备份,历史查看,协同开发,权限管理。
版本库、工作副本及修订版本(repository & working copy & revision)
利用svn管理一个项目前,我们会将包含源码文件的目录提交,导入(import)到版本库(存储所有修订版本历史记录的地方)。而我们在开发工作中,便从版本库中导出一个工作副本(从配置管理系统的文件库中取出的保存在本地的文件副本),在此副本上进行工作(文件修改),而在工作完成后提交,更新版本库,产生新的修订版本号(从版本控制系统中可以找到从文件创建到最后一次提交的每一个修订版本号对应的每一个版本)。
svn基本工作周期
1. 更新工作副本(update working copy)。(ps: 此处update并不是指modify和change涵义的更新,而是指将本地版本号小的替换为服务器上版本号更大的文件,即 更新的版本文件。)
2. 修改代码。编辑存在的文件的内容应该是最频繁的动作了。不仅仅是修改文件,有时候也需要添加、删除、复制或移动文件和目录。(add delete copy move)
3. 查看修改记录。(status diff)。
4. 修正错误。当发现改动过的工作副本因为编辑而添加了错误,最好的处理就是恢复到修改前的状态。(revert)
5. 解决冲突(合并多人的更改)。不仅仅只有一个人在对文件进行编辑,必须避免冲突及更改丢失。(update,resolve)
6. 提交更改。当作的更改提交并接受后,便更新了版本库(版本号+1)。
check in & check out & commit & update
检入(svn commit) 指将自己的工作副本提交到配置管理系统的文件库中,使得他人可以从文件库中获取你的最新修改版本。检出(svn checkout) 指从配置管理系统的文件库中取出一个副本作为自己的工作副本,并在这个工作副本上进行自己的工作。
每次执行svn update时,当前工作副本会更新为代码库内保存的最新版本。而在工作副本进行的修改并不会在版本库中。而在检入提交修改后,就会在版本库添加新的版本。其他工作者利用update就可以得到最新版本的工作副本。
在svn中,"check in"(检入)这个动作命令为(svn commit)。不同工具中的对等词如下:
SVN VSS CVS
commit checkin commit
update getLatestVersion checkout/updateselection
版本库访问方式
可以通过多种方式访问:本地磁盘访问,或各种各样不同的网络协议。一个版本库地址永远都只是一个URL。
模式 访问方法
file:/// 直接版本库访问(本地磁盘)
http:// 通过配置Subversion的Apache服务器的WebDAV协议
https:// 与http://相似,但是包括SSL加密。
svn:// 通过svnserve服务自定义的协议
svn+ssh:// 与svn://相似,但通过SSH封装。
svn组件
svn:命令行客户端程序。
svnversion:此工具用来显示工作副本(当前项目的修订版本)的状态。
svnlook:直接查看版本库的工具。
svnadmin:建立、调整和修复版本库的工具。
svndumpfilter:过滤版本库转储数据流的工具。
mod_dav_svn:Apache的一个插件,使版本库可以通过网络访问。
svnserve:一个单独运行的服务器程序,可以作为守护进程或由SSH调用。这是另一种使版本库可以通过网络访问的方式。
svnsync:一个通过网络增量镜像版本库的程序。
svn配置
基于上次配置的apache目录为/usr/share/apache2 (http://blog.csdn.net/ottocho/article/details/7247992)
下载svn
http://subversion.apache.org/download/
configure && make && install
$ ./configure --with-apxs=/usr/share/apache2/bin/apxs
--prefix=/usr/share/subversion --with-apr=/usr/share/apache2
--with-apr-util=/usr/share/apache2 --with-ssl --with-zlib
--enable-maintainer-mode
$ make
$ make install
为便于理解,以下全部使用绝对路径。下文$行为命令,#行为注释。#注释行通常为其紧随几行命令的解释与注解。以下为一个可以使用的配置方法,介绍了联合apahce使版本库可以通过网络访问的方法。具体解释请参考svnbook。
# 创建新的版本库
$ /usr/share/subversion/bin/svnadmin create /home/ottocho/svn
# 把路径/home/ottocho/src/下的文件导入到你创建的版本库中去,提交后的修订版本号为1。
$ /usr/share/subversion/bin/svn import /home/ottocho/src/ file:///home/ottocho/svn -m "lib"
# 去除其他人对该目录的权限
$ chmod 700 /home/ottocho/svn
# 增加用户 利用apache的工具htpasswd生成用户文件
# /usr/share/apache2/bin/htpasswd /home/ottocho/svn/conf/authfile ottocho
# 以上命令用以修改用户密码
$ /usr/share/apache2/bin/htpasswd -c /home/ottocho/svn/conf/authfile ottocho
# 分配权限
$ vim /home/ottocho/svn/conf/authz
# 版本库所有人为只读,ottocho用户为读写权限。添加内容如下:
[/]
* = r
ottocho = rw
# 修改Apache配置文件,/usr/share/apache2/conf/httpd.conf添加内容如下:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
DAV svn
SVNPath /home/ottocho/svn
AuthzSVNAccessFile /home/ottocho/svn/conf/authz
AuthType Basic
AuthName "Subversion.zoneyump"
AuthUserFile /home/ottocho/svn/conf/authfile #用户文件在此
Require valid-user
设置完成后,就可以
$ /usr/share/apache2/bin/apachectl start
将这个。重启Apache,就可以通过
http://localhost/svn 来访问版本库了
# 以下请注意区分版本库的URL格式(如上文)及文件路径区别。
# 检出一个工作副本进行工作:
$ /usr/share/subversion/bin/svn checkout file:///home/ottocho/svn /home/ottocho/workdir/src
# 确认导入的项目是否正确:
$ /usr/share/subversion/bin/svn list --verbose file:///home/ottocho/svn
# 输出版本库的最新修订版本信息,包括作者、时间、日志字数和日志内容等。
# 可以在命令后面接 “--revision 版本号” 来指定某一个修订版的显示。
$ /usr/share/subversion/bin/svnlook info /home/ottocho/svn
# 显示版本库的具体树形结构,后面的 “--show-ids” 选项指定显示每一个显示元素的修改版本 ID。
$ /usr/share/subversion/bin/svnlook tree /home/ottocho/svn --show-ids
svn基本功能及命令:
1. import:
svn import 项目文件夹 版本库URL
2. checkout: (co)
svn co 版本库URL [检出位置]
svn co -r 12 版本库URL # 出第12版的 projcets code
3. list: (ls)
svn ls 版本库URL
#以下命令在工作副本中进行
4. update: (up) 更新成最新版本
SVN_CHECKOUT_DIR$ svn up
5. commit: (ci), 将目前所做的修改提交版本库
SVN_CHECKOUT_DIR$ svn ci filename -m "here is a log" #尽量写log,这对团队有很大帮助。
6. status: (st), 看目前文件/结构与版本库的区别
SVN_CHECKOUT_DIR$ svn st
7. add: 将文件/目录新增入版本库
SVN_CHECKOUT_DIR$ svn add file_name
SVN_CHECKOUT_DIR$ svn add directory_name
8. mv: 修改版本库文件名
SVN_CHECKOUT_DIR$ svn mv filename new_filename
9. revert: 还原修改, 回到前一版状态(未 commit 前可用)
SVN_CHECKOUT_DIR$ svn revert [file|directory]
10. diff: 历史版本比较
SVN_CHECKOUT_DIR$ svn diff -r N:M
11. lock: 锁定文件
SVN_CHECKOUT_DIR$ svn lock filename
12. unlock: 解锁文件
SVN_CHECKOUT_DIR$ svn unlock filename
svn文件状态
?: 文件不存在版本库中
A: 此次新增的文件
C: 此文件已经有人修改,无法合并,需要人工并入
D: 此次移除的文件
M: 此文件有修改過
U: 此文件有被更新過