Subversion简介
Subversion
Subversion 是一个 免费/开源 的 版本控制系统 (version control system, 简称 VCS), 也就是说, Subversion 可以跨越时间对文件和目录, 以及它们的修改进行管理. 这就允许你恢复 数据的旧版本, 或检查数据的修改历史.
Subversion 的架构
基本工作周期
Subversion 支持的特性与选项非常丰富, 但是能够在日常工作中用到的却很 少. 日常工作中最常用到的 Subversion 操作.
典型的工作周期就像:
-
更新工作副本. 这会用到命令 svn update.
-
修改.最常见的修改就是编辑已有文件的内容, 但有时还要添加, 删除, 复制和移动文件或目录 — 命令 svn add, svn delete, svn copy 和 svn move 负责 处理工作副本的结构性调整.
-
审核修改. 用命令 svn status 和 svn diff 查看工作副本发生了哪些变化.
-
修正错误. 人无完人, 在审核修改时用户可 能会发现某些修改是不正确的. 有时候修正错误最简单的方式是撤消所有的 修改, 重新开始. 命令 svn revert 可以把文件或目 录恢复到修改前的样子.
-
解决冲突 (合并其他人的修改). 当一个用户 正在修改文件时, 其他人可能已经把自己的修改提交到了服务器上. 为了防止 在提交修改时, 由于工作副本过旧导致提交失败, 用户需要把其他人的修改 更新到本地, 用到的命令是 svn update. 如果命令 的执行结果有冲突产生, 用户需要用命令 svn resolve 解决冲突.
-
发布 (提交) 修改. 命令 svn commit 把工作副本的修改提交到仓库中, 如果修改 被接受, 其他用户就可以看到这些修改.
基本用法:
出去上面那些,还有一下比较常用的如下:
在版本库目录下: svn + help , import , list , checkout , status , log , cat , annonate , lock , changelist , copy , merge .
仓库的定义
如果站在文件浏览器 (例如 Windows 资源管理器) 或基于命令行的文件 系统导航工具来看, Subversion 仓库只是一个包含了众多数据的普通目录, 其中一些子目录包含了人类可读的配置文件, 还有些子目录包含的是人类不可 读的文件.
基本组件:
# ls
conf db format hooks locks README.txt
conf/ 存放配置文件的目录
db/ 该目录包含了与所有版本化数据相关的数据
format 该文件描述了仓库的内部组织结构. (目录 db/
有时候也会有一个叫做 format
的文件, 这个 format
仅仅是在描述 db/
的内容, 这两个 format
之间并没有关系.)
hooks/ 该目录包含了钩子脚本模板和已安装的钩子脚本.
locks/ Subversion 用该目录存放仓库的锁文件, 锁文件用于管理仓库的并发 访问.
README.txt 包含了一小段内容的文本文件, 文件的内容仅仅是为了提醒计算机 用户该文件所在的目录是一个 Subversion 仓库.
创建仓库
创建 Subversion 仓库是一件非常简单的工作, 用到的命令是 svnadmin create.
$ # Create a repository $ svnadmin create /var/svn/repos $
假设父目录 /var/svn
已存在, 并且管理员对父 目录拥有写权限, 上面的命令在 /var/svn/repos
创建了一个新的仓库, 使用的是默认的后端存储类型 (FSFS). 你还可以利用 选项 --fs-type
显式地指定后端存储类型, 该选项接受 的参数是 fsfs
或 bdb
.
$ # Create an FSFS-backed repository $ svnadmin create --fs-type fsfs /var/svn/repos $
# Create a legacy Berkeley-DB-backed repository $ svnadmin create --fs-type bdb /var/svn/repos
使用 svnadmin 迁移仓库数据
无论迁移仓库历史是出于什么样的原因, svnadmin dump 和 svnadmin load 的用法都非常 简单直接. svnadmin dump 按照 Subversion 的文件 系统转储格式, 输出一段范围内的版本号. 转储的结果会被打印到标准输出, 而提示性的信息则会打印到标准错误, 这就允许管理员把输出重定向到文件 的同时, 在终端窗口中查看命令的状态输出, 例如:
$ svnlook youngest myrepos 26 $ svnadmin dump myrepos > dumpfile * Dumped revision 0. * Dumped revision 1. * Dumped revision 2. …
命令执行结束时, 你将得到一个文件 (在上面的例子里, 文件名是 dumpfile
), 这个文件包含了在指定的版本号范围 内, 存放在仓库中的所有数据. 因为 svnadmin dump 从仓库中读取版本号的过程和其他 “读者” (例如 svn checkout) 读取仓库的过程是一样的, 所以 可以在任意时刻, 安全地执行 svnadmin dump.
与 svnadmin dump 配对的命令 svnadmin load 从标准输入读取 Subversion 仓库的转储文件, 把文件中 的版本号重放到目标仓库中. 在命令的执行过程中仍然会输出提示性的信息, 不过这次是打印到标准输出:
$ svnadmin load newrepos < dumpfile <<< Started new txn, based on original revision 1 * adding path : A ... done. * adding path : A/B ... done. …
仓库备份
对于 Subversion 仓库管理员来说, 有两种备份策略—全量备份与 增量备份.
$ svnadmin hotcopy /var/svn/repos /var/svn/repos-backup
得到的备份是一个完整的 Subversion 仓库, 能够在原仓库出现故障时 顶替上去.
移动与删除仓库
Subversion 仓库的所有数据都存放在仓库目录中, 所以说管理员可以使用 操作系统提供的命令—Unix 系统的 mv, cp -a, rm -r; Windows 系统的 move, copy, rmdir /s /q; 或其他图形化文件浏览器提供的鼠标和菜单操作— 实现仓库的移动, 重命名, 复制和删除.
版本库维护
svnadmin程序除了提供创建Subversion版本库的功能,这个程序使你可以维护这些版本库。
# svnadmin help general usage: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...] Type 'svnadmin help <subcommand>' for help on a specific subcommand. Type 'svnadmin --version' to see the program version and FS modules. Available subcommands: crashtest create deltify dump help (?, h) hotcopy list-dblogs list-unused-dblogs load lslocks lstxns pack recover rmlocks rmtxns setlog setrevprop setuuid upgrade verify
svnlook是Subversion提供的用来查看版本库中不同的修订版本和事务(正在产生的修订版本)。这个程序不会修改版本库内容-这是个“只读”的工具。
# svnlook help general usage: svnlook SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...] Note: any subcommand which takes the '--revision' and '--transaction' options will, if invoked without one of those options, act on the repository's youngest revision. Type 'svnlook help <subcommand>' for help on a specific subcommand. Type 'svnlook --version' to see the program version and FS modules. Available subcommands: author cat changed date diff dirs-changed filesize help (?, h) history info lock log propget (pget, pg) proplist (plist, pl) tree uuid youngest