作者: 溪水清澈
Tortoise是配合资源管理器用的.
svn 命令行客户端程序。
svnversion
显示工作拷贝的状态(用术语来说,就是当前项目的修订版本)。
svnlook直接查看Subversion版本库的工具。
svnadmin建立、调整和修复Subversion版本库的工具。
svndumpfilter过滤Subversion版本库转储数据流的工具。
mod_dav_svn ApacheHTTP服务器的一个插件,使版本库可以通过网络访问。
svnserve一个单独运行的服务器程序,可以作为守护进程或由SSH调用。这是另
一种使版本库可以通过网络访问的方式。
svnsync 一个通过网络增量镜像版本库的程序。版本库历史复制.
每更新一项就输出一行信息,使用首字符来报告执行的动作。这些字符的含义是:
A 已添加
D 已删除
U 已更新
C 合并冲突
G 合并成功
E 已存在
全局选项:
--username ARG : 指定用户名称 ARG
--password ARG : 指定密码 ARG
--no-auth-cache : 不要缓存用户认证令牌
--non-interactive : 不要交互提示
--trust-server-cert : 不提示的接受未知的
SSL服务器证书(只用于选项 “--non-interactive”)
--config-dir ARG : 从目录 ARG 读取用户配置文件
--config-option ARG : 以下属格式设置用户配置选项:
FILE:SECTION:OPTION=[VALUE]
例如:
servers:global:http-library=serf
- 日志
-m 或 --message "日志内容"
一定要用双引号
- svn checkout 远程目录 本地目录
目录对目录的copy
列表中的A表示Subversion增加了一些条目到工作拷贝
表 1.1. 版本库访问URL
模式访问方法
file:/// 直接版本库访问(本地磁盘)(注意是三个/)
http://通过配置Subversion的Apache服务器的
WebDAV协议
https://与http://相似,但是包括SSL加密。
svn://通过svnserve服务自定义的协议
svn+ssh://与svn://相似,但通过SSH封装。
- svn import 本地目录 远程URL
把本地目录导入到远程 版本库中,
但是本地目录不进行版本化.
如果想版本化, 还需要svn checkout
- svn checkout 远程url 本地目录
本地目录可以不写,
如果不写, 则会把远程的代码库目录名, 当成本地目录.
- svn commit . --username yf -m "commit log"
使用yf用户提前当前目录, 日志为 commit log
- svn add foo
把foo添加到目录树中,
如果foo是一个目录, 会把foo下的所有文件都添加进去,
如果不想添加目录foo下的文件, 使用参数 -N 或 --non-recursive
- svn delete foo
- svn copy foo bar
- svn move foo bar
- svn mkdir dir_a
以上四个命令可以把foo换成 URL 地址, 表示直接操作版本库
只操作版本库, 不在本地创建.
- svn status 目录或文件
哪些文件被修改了
如果不带目录, 只显示当前目录及子目录下, 哪里被修改了
- svn status -v verbose
显示当前copy的status, 与本地版本库比较
- svn status -u //update
显示当前copy的status, 与服务器版本库对比
如果信息有 * 星号, 表示服务器版本较新
预测冲突
- svn revert
svn revert 文件 -r 版本号
恢复文件到 版本号
- svn log 展示给你主要信息:每个版本附加在版本上的作者与日期
信息和所有路径修改。
svn log -r 3:5
升序显示日志, 从版本3 - 版本5
svn log -v
显示详细信息
- svn diff 显示特定修改的行级详细信息。
svn diff -r 4:5
比较R4和R5两个版本
只是比较两个路径, 而非比较同一个对象的不同版本
- svn diff -c 3
<==> svn diff -r 2:3 与前一个版本比较
显示范围为: 变化的行 + 前后三行
- svn cat 取得在特定版本的某一个文件显示在当前屏幕。
svn cat -r 2 readme.txt
显示R2中的readme.txt
- svn list 显示一个目录在某一版本存在的文件。
不下载文件, 显示库内容.
注: 此命令是显示服务器上的内容, 而不是本地的.
显示本地, 请使用: dir, ls 等等.
svn list -R
递归显示
- svn export 版本库URL
导出版本库, 但不创建.svn目录
- svn cleanup
递归清理工作副本,删除锁,继续未完成操作,等等。
如果svn的工作被意外中断了,
比如死机, 断电 等等,
这个命令会继续执行上次未完成的任务, 并清理任务日志.
版本号: 不区分大小写
- 数字
- HEAD 版本库中最新的(或者是“最年轻的”)版本。
BASE 工作拷贝中一个条目的修订版本号,如果这个版本在本地修改了,则“BASE版本”就是这个条目在本地未修改的版本。
COMMITTED项目最近修改的修订版本,与BASE相同或更早。
PREV一个项目最后修改版本之前的那个版本,技术上可以认为是COMMITTED -1
- svn log -r head:prev
显示最新版本和上一版的日志
- svn checkout -r {2006-02-17T15:30}
最接近指定时间的版本
如果不指定时分秒, 按 0:0:0 算
- svn blame 文件
此文件中, 第一行都是在哪个版本中添加或修改的.
属性名可以是 字母, 数字, 减号, 点号
- svn propset 属性名 "属性值" (如果需要引号, 一定是双引号)
- svn propset 属性名 "属性值" -R 目录
递归的对此目录下所有文件设置属性
- svn propedit 属性名
如果提示什么变量没设置, 可以使用 set 变量名=值 来设置
- svn proplist *
可以列出所有文件的属性名, 只是属性名, 不带值的
- svn proplist * -v
名称和值都列出.
忽略:
目录属性名: svn:ignore
不是正则, * 代表多个
- svn:needs-lock
把文件变只读,
当编辑之前, 会要求先锁定文件
- svn:externals属性
此属性可以使得在update 某个版本库时, 把别的版本库包含到当前目录下
例:
svn propedit svn:externals .(点表示当前目录)
在弹出的编辑器中输入如下:
MyR1 https://s.com/svn/r1
就会把版本库r1 中的数据, 更新到当前目录下的目录MyR1中
当然, 定义了属性以后, 要commit, 别的用户在checkout时, 才会有效
貌似程序实现的不是很好, 建议不要使用.
- svn:mime-type
此属性会在浏览器中浏览库中的文件时, 生效,
浏览器会按这个值来渲染文件
- 关键字:
注: 关键字区分大小写, 直接修改关键字这一行, svn认为文档没有修改
别名和关键字意义相同,
在svn:keywords(区分大小写)在, 别名和正名都可以使用.
在svn:keywords中, 手册说以空格分割关键字,
实际上应该是空白, 包括 空格 \t \n
$Date:: $ 可以限制关键字的最大长度
Date: $Date:2013-02-28 14:33:20 +0800 (周四, 2013-02-28) $
LastChangedDate:$LastChangedDate: 2013-02-28 14:33:20 +0800 (周四, 2013-02-28) $
Revision:$Revision: 34 $
LastChangedRevision:$LastChangedRevision: 34 $
Rev: $Rev: 34 $
Author: $Author: hy$
LastChangedBy:$LastChangedBy: hy $
HeadURL: $HeadURL: https://s.com/svn/news/readme.txt$
$URL: https://s.com/svn/news/readme.txt$
Id: $Id: readme.txt31 2013-02-28 06:29:01Z hy $
- svn lock 文件
锁定文件
- svn lock 文件 --force
即使别人已锁定, 也可以获得锁
- svn status -u
查看版本库的更新信息, 第六列
O
锁定(Other)
T
(偷)被窃取
B
打破(Broken)
K
表示被锁定
X
eXternals
- svn info 文件(* 表示所有文件 )
显示详细信息
- svn info URL
可以显示目前谁锁定了文件
- svnadmin lslocks 库路径(非URL)
显示库下所有锁, 可多个
- Rev和Peg
Rev: 实施的修订版本, 表示当前文件在某个版本的内容
Peg: 中文名未知, 表示当前路径在某个版本的样子
举例如下:
在Rev1有个文件叫index.html, 内容为: index at rev1
在Rev2时, 删除了index.html: svn delete index.html
在Rev3时, 我们又添加了一个 index.html, 内容为: index.added at rev3
此时, 如果我们想查找 在 Rev1时, 文件名为index.html的文件内容如何?
svn cat index.html@1 // 定位到 路径在版本1时的对象
结果为: index at rev1
svn cat -r 1 index.html //定位到当前面对象,
//回溯到版本1时, 当前对象是什么样子
结果为: 报错, 因为当前对象在Rev1时不存在.
svn cat-r Rev Path@Peg
意思为: 在Peg版本中, Path路径所表示的对象 在 Rev中 的内容
- 使用协议
svn --version
会显示本版本svn可以使用什么协议与服务器通讯
- 密码缓存
C:\Users\IceWindYoung\AppData\Roaming\Subversion\auth\svn.simple
- 创建分支:
直接复制原有文件即可, 当然是svn copy 而非操作系统的复制
如:
svn copy trunk branch\new-trunk
或
svn https://s.com/svn/repo1/trunk https://s.com/svn/repo1/branch/new-trunk
复制并不是真实的复制文件, 而是增量复制.
Subversion并没有内在的分支概念—只有拷贝,
当你拷贝一个目录,这个结果目录就是一个“分支”,
只是因为你给了它这样一个含义而已。
- 合并分支
svn merge -c M,N 源URL 工作copy
把 源URL 从 版本M到N的变化 合并到 工作copy中
- 在版本控制术语中,这种在分支之间拷贝修改的行为叫做搬运修改。
- svn merge 合并时会时会注意到两个文件有没有共同的祖先,
如果有, 才进行行比较, 然后合并内容,
但如果加上参数: --ignore-ancestry 则直接按路径比较,
- 迭代恢复(svn revert --recursive)
- svn log --stop-on-copy
查找日志, 到 分支建立时, 因为copy就是建分支
- 分支合并到主干:
- 在分支中, 查看分支建立版本, 以前分支当前版本
svn log -v --stop-on-copy
- 目录转到主干中: cd 主干目录
- svn merge -r 分支建立版本:分支当前版本 分支的URL
把分支从建立到当前的变化加入到主干.
- 全并分支中 新的内容
- 在主干中, 查看上一次合并的版本, 定为 LastMergeRev
- 在主干目录中, 执行:
svn merge -r LastMergeRev:Head 分支URL
- 反向合并
只要在指定版本时, 左版本大于右版本即可.
svn merge -r 30:29 版本库URL
会把修改变到29
- 找回删除的项目
- 先找到 所要找回的对象 所在的版本
- svn copy -r 版本 对象URL 对象本地文件名
- svn switch 分支URL
和svn update的区别
svn switch 把当前目录的 URL改为 分支URL, 并更新
svn update 只是更新
- 标签: 最终发布的版本, 版本库在某一个时刻的快照
建立方式同 建立分支, 也是copy, 注意日志说明
标签的产生过程与建立分支是一样的?
是的,实际上在Subversion中标签与分支没有区别,都是普通的目录,
通过copy命令得到,
与分支一样,一个目录之所以是标签只是人们决定这样使用它,
只要没有人提交这个目录,它永远是一个快照,
但如果人们开始提交,它就变成了分支
- 可以copy本地目录到URL库中, URL库路径的最后一级目录可以自动创建,
前面的目录需要已存在.
- 如果你在trunk做了半天工作, 但是突然发现, 你也许应该在分支中做这些工作?
如果保存已做的工作, 并切换到分支中?
- svn copy https://s.com/svn/zhut/trunk https://s.com/svn/zhut/branch/newbranch
- svn switch https://s.com/svn/zhut/branch/newbranch
已在trunk上做的工作, 会被保存.
- 供方分支
使用目录 /vendor
- 建立供方drop
- 建立供方标签
- 复制标签到trunk
- 当供方更新时,
- 重建供方drop
- 把供方标签到供方drop合并到trunk
svn merge https://...供方drop https://...供方标签 当前copy
- 管理版本库
一库多项目, 缺点是我没修改, 但Rev依然在增加.
一库一项目,
混合(把相关项目组合成一个库)
- 目录布局
什么样的都可以, 对SVN来说, 目录就是目录, 没有别的意义.
注意: 听取一个项目参与者的意见.
- 后端
后端就是版本库的储存方式, 包括BDB数据库和 FSFS文件
- svnlook youngest /path/to/repo
显示最大版本号.
- svnlook author 作者
- svnlook changed 库路径(非URL)
显示版本库路径的改变
- svnlook diff
- svnadmin setlog myrepos newlog.txt -r Rev
在服务器端设置日志
- svnadmin lstxns myrepos
列出未提交的事务
- svnadmin rmtxns myrepo
删除未提交的事务
- svnadmin dump 版本库本地路径 >> 版本库导出储存文件
- svnadmin load 版本库本地路径(要由svnadmin create初始化) < 转储文件
- 或者:
svnadmin dump 路径 | svnadmin load 新路径
- 多文件转储
svnadmin dump myrepos -r 0:1000 > dumpfile1
svnadmin dump myrepos -r 1001:2000 --incremental > dumpfile2
svnadmin dump myrepos -r 2001:3000 --incremental > dumpfile3
- 转储过滤, 就是版本库删除
svndumpfilter include 要留下的路径前缀( 应该是相对于根的 相对路径 )
exclude 不包含的路径前缀
- 热备份
svnadmin hotcopy /path/to/repos /path/to/repos-backup
- 建立服务器:
windows进程
sc create SvnServiceName binpath= "svnserve --service"
- 配置文件, svnserve.conf
password-db 控制用户的整体权限
authz-db 控制用户对某个目录的权限
realm 登录时的提示信息
如果用户想访问某个版本库中的某个对象, 必须满足所有 授权 规则
- svn 和 apache
失败, 因为在apache上, LoadModule失败,
所以手册内容, 无法理解.
- 创建日志, 未测试.
CustomLog logs/svn_logfile "%t %u %{SVN-ACTION}e" env=SVN-ACTION
- 配置文件:
Win7: C:\Users\IceWindYoung\AppData\Roaming\Subversion
此目录在Win7中用常量 %APPDATA% 表示
如果对配置文件不满, 把这个目录删掉,
再随便运行个svn命令即可, 如: svn --version
- 配置文件例子
[HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Servers\global]
"#http-proxy-host"=""
"#http-proxy-port"=""
"#http-proxy-username"=""
"#http-proxy-password"=""
"#http-proxy-exceptions"=""
"#http-timeout"="0"
"#http-compression"="yes"
"#neon-debug-mask"=""
"#ssl-authority-files"=""
"#ssl-trust-default-ca"=""
"#ssl-client-cert-file"=""
"#ssl-client-cert-password"=""
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auth]
"#store-passwords"="yes"
"#store-auth-creds"="yes"
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\helpers]
"#editor-cmd"="notepad"
"#diff-cmd"=""
"#diff3-cmd"=""
"#diff3-has-program-arg"=""
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\tunnels]
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"#global-ignores"="*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store"
"#log-encoding"=""
"#use-commit-times"=""
"#no-unlock"=""
"#enable-auto-props"="" //yes | no
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auto-props]
*.txt = svn:keywords=Id //给所以有txt文件添加关键字属性
- servers文件
[groups]
组名 = 带通配符的主机名 //表示此主机名的访问权限由相应的组名来控制
[组名]
访问权限
[global]
未在groups段中匹配的主机由此处设置
- 汉化包位置
D:\Program Files\Subversion\share\locale