SVN 的全称是 Subversion, 即版本控制系统. 它是最流行的一个开放源代码的版本控制系统. 作为一个开源的版本控制系统, Subversion 管理着随时间改变的数据. 这些数据放置在一个中央资料档案库 (Repository) 中. 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动. 这样就可以把档案恢复到旧的版本, 或是浏览文件的变动历史. Subversion 是一个通用的系统, 可用来管理任何类型的文件, 其中包括程序源码.
SVN 采用客户端 / 服务器体系, 项目的各种版本都存储在服务器上, 程序开发人员首先将从服务器上获得一份项目的最新版本, 并将其复制到本机, 然后在此基础上, 每个开发人员可以在自己的客户端进行独立的开发工作, 并且可以随时将新代码提交给服务器. 当然也可以通过更新操作获取服务器上的最新代码, 从而保持与其他开发者所使用版本的一致性.
SVN 的客户端有两类, 一类是基于 web 的 WebSVN 等, 另一类是以 Tortoise SVN 为代表的客户端软件. 前者需要 Web 服务器的支持, 后者需要用户在本地安装客户端, 两种都有免费的开源软件供使用. SVN 存储版本数据也两种方式: BDB(一种事务安全型表类型)和 FSFS(一种不需要数据库的存储系统). 因为 BDB 方式在服务器中断时, 有可能锁住数据, 所以还是 FSFS 方式更安全一点.
SVN 基本的操作流程就是:
你刚刚进入一个新的公司, 让你接手一个正在进行的项目, 你打开终端写下了:
SVN co SVN://192.168.1.1/pro/domain
然后就可以在当前目录里面找到一个叫 domain 的项目, cd domain, 你浏览了几行代码, 太特么的竟然有 bug, 你忍不住改了, 你要提交了
SVN ci -m 'something'
成功. 你又在 domain 下得 App 文件夹下添加了几个. PHP 文件, 把整个项目都做完了! 你又打开终端:
SVN add domain/App/*.PHP
添加成功. 太牛逼了, 下班了, 你去吃了一碗自己最喜欢的老坛酸菜味方便面.
以下是一些常用命令
1, 将文件 checkout 到本地目录
SVN checkout path(path 是服务器上的目录)
例如: SVN checkout SVN://192.168.1.1/pro/domain
简写: SVN co
2, 往版本库中添加新的文件
SVN add file
例如: SVN add test.PHP(添加 test.PHP)
SVN add *.PHP(添加当前目录下所有的 PHP 文件)
3, 将改动的文件提交到版本库
SVN commit -m "LogMessage" [-N] [--no-unlock] PATH(如果选择了保持锁, 就使用 - no-unlock 开关)
例如: SVN commit -m "add test file for my test" test.PHP
简写: SVN ci
4, 加锁 / 解锁
SVN lock -m "LockMessage" [--force] PATH
例如: SVN lock -m "lock test file" test.PHP
SVN unlock PATH
5, 更新到某个版本
SVN update -r m path
例如:
SVN update 如果后面没有目录, 默认将当前目录以及子目录下的所有文件都更新到最新版本.
- SVN update -r 200 test.PHP(将版本库中的文件 test.PHP 还原到版本 200)
- SVN update test.PHP(更新, 于版本库同步. 如果在提交的时候提示过期的话, 是因为冲突, 需要先 update, 修改文件, 然后清除 SVN resolved, 最后再提交 commit)
简写: SVN up
6, 查看文件或者目录状态
SVN status path(目录下的文件和子目录的状态, 正常状态不显示)
[?: 不在 SVN 的控制中; M: 内容被修改; C: 发生冲突; A: 预定加入到版本库; K: 被锁定]
SVN status -v path(显示文件和子目录状态)
第一列保持相同, 第二列显示工作版本号, 第三和第四列显示最后一次修改的版本号和修改人.
注: SVN status,SVN diff 和 SVN revert 这三条命令在没有网络的情况下也可以执行的, 原因是 SVN 在本地的. SVN 中保留了本地版本的原始拷贝.
简写: SVN st
7, 删除文件
SVN delete path -m "delete test fle"
例如: SVN delete SVN://192.168.1.1/pro/domain/test.PHP -m "delete test file"
或者直接 SVN delete test.PHP 然后再 SVN ci -m 'delete test file', 推荐使用这种
简写: SVN (del, remove, rm)
8, 查看日志
SVN log path
例如: SVN log test.PHP 显示这个文件的所有修改记录, 及其版本号的变化
9, 查看文件详细信息
SVN info path
例如: SVN info test.PHP
10, 比较差异
SVN diff path(将修改的文件与基础版本比较)
例如: SVN diff test.PHP
SVN diff -r m:n path(对版本 m 和版本 n 比较差异)
例如: SVN diff -r 200:20test.PHP
简写: SVN di
11, 将两个版本之间的差异合并到当前文件
SVN merge -r m:n path
例如: SVN merge -r 200:205 test.PHP(将版本 200 与 205 之间的差异合并到当前文件, 但是一般都会产生冲突, 需要处理一下)
12,SVN 帮助
- SVN help
- SVN help ci
13, 版本库下的文件和目录列表
SVN list path
显示 path 目录下的所有属于版本库的文件和目录
简写: SVN ls
14, 创建纳入版本控制下的新目录
SVN mkdir: 创建纳入版本控制下的新目录.
用法:
1,mkdir PATH...
2,mkdir URL...
创建版本控制的目录.
1, 每一个以工作副本 PATH 指定的目录, 都会创建在本地端, 并且加入新增
调度, 以待下一次的提交.
2, 每个以 URL 指定的目录, 都会透过立即提交于仓库中创建.
在这两个情况下, 所有的中间目录都必须事先存在
15, 恢复本地修改
SVN revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改).revert:
用法: revert PATH...
注意: 本子命令不会存取网络, 并且会解除冲突的状况. 但是它不会恢复
被删除的目录
16, 代码库 URL 变更
SVN switch (sw): 更新工作副本至不同的 URL.
用法: 1,switch URL [PATH]
2,switch -relocate FROM TO [PATH...]
1, 更新你的工作副本, 映射到一个新的 URL, 其行为跟 "svn update" 很像, 也会将
服务器上文件与本地文件合并. 这是将工作副本对应到同一仓库中某个分支或者标记的
方法.
2, 改写工作副本的 URL 元数据, 以反映单纯的 URL 上的改变. 当仓库的根 URL 变动
(比如方案名或是主机名称变动), 但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系.
17, 解决冲突
SVN resolved: 移除工作副本的目录或文件的 "冲突" 状态.
用法: resolved PATH...
注意: 本子命令不会依语法来解决冲突或是移除冲突标记; 它只是移除冲突的
相关文件, 然后让 PATH 可以再次提交
查看修改的文件记录
SVN cat -- 显示特定版本的某文件内容.
SVN list -- 显示一个目录或某一版本存在的文件列表.
SVN log -- 显示 SVN 的版本 log, 含作者, 日期, 路径等.
SVN diff -- 显示特定修改的行级详细信息.
list 示例:
- SVN list http://svn.test.com/svn #查看目录中的文件.
- SVN list -v http://svn.test.com/svn #查看详细的目录的信息(修订人, 版本号, 文件大小等).
- SVN list [-v] #查看当前当前工作拷贝的版本库 URL.
cat 示例:
SVN cat -r 4 test.c #查看版本 4 中的文件 test.c 的内容, 不进行比较.
diff 示例:
- SVN diff #什么都不加, 会坚持本地代码和缓存在本地. SVN 目录下的信息的不同; 信息太多, 没啥用处.
- SVN diff -r 3 #比较你的本地代码和版本号为 3 的所有文件的不同.
- SVN diff -r 3 text.c #比较你的本地代码和版本号为 3 的 text.c 文件的不同.
- SVN diff -r 5:6 #比较版本 5 和版本 6 之间所有文件的不同.
- SVN diff -r 5:6 text.c #比较版本 5 和版本 6 之间的 text.c 文件的变化.
- SVN diff -c 6 test.c #比较版本 5 和版本 6 之间的 text.c 文件的变化.
log 示例:
- SVN log #什么都不加会显示所有版本 commit 的日志信息: 版本, 作者, 日期, comment.
- SVN log -r 4:20 #只看版本 4 到版本 20 的日志信息, 顺序显示.
- SVN log -r 20:5 #显示版本 20 到 4 之间的日志信息, 逆序显示.
- SVN log test.c #查看文件 test.c 的日志修改信息.
- SVN log -r 8 -v #显示版本 8 的详细修改日志, 包括修改的所有文件列表信息.
- SVN log -r 8 -v -q #显示版本 8 的详细提交日志, 不包括 comment.
- SVN log -v -r 88:866 #显示从版本 88 到版本 866 之间, 当前代码目录下所有变更的详细信息 .
- SVN log -v dir #查看目录的日志修改信息, 需要加 v.
- SVN log http://foo.com/svn/trunk/code/ #显示代码目录的日志信息.
常用命令
SVN add file|dir -- 添加文件或整个目录
SVN checkout -- 获取 SVN 代码
SVN commit -- 提交本地修改代码
SVN status -- 查看本地修改代码情况: 修改的或本地独有的文件详细信息
SVN merge -- 合并 SVN 和本地代码
SVN revert -- 撤销本地修改代码
SVN resolve -- 合并冲突代码
SVN help [command] -- 查看 SVN 帮助, 或特定命令帮助
SVN diff 个性化定制
SVN 配置文件: ~/.subversion/config
修改~/.subversion/config, 找到如下配置行:
# diff-cmd = diff_program (diff, gdiff, etc.)
将上面那个脚本的路径添加进去就行, 修改为
diff-cmd = /usr/local/bin/diffwrap.sh #绝对路径
这样 SVN diff 命令就会默认使用 vimdiff 比较文件.
diffwrap.sh 文件
- #! /bin/bash
- # for SVN diff: 修改~/.subversion/config, 找到如下配置行:
- # diff-cmd = diff_program (diff, gdiff, etc.)
- # diff-cmd = ~/bin/diffwrap.sh
- # 参数大于 5 时, 去掉前 5 个参数; 参数小于 5, 失败, 什么也不做
- shift 5
- # 使用 vimdiff 比较
- vimdiff "$@"
参考文献
使用 vimdiff 作为 SVN diff 的查看代码工具: https://www.jb51.net/LINUXjishu/734861.html
SVN 常用命令:
SVN 常用操作命令
检出
- SVN checkout http:// 路径(目录或文件的全路径) [本地目录全路径] --username 用户名
- SVN checkout SVN:// 路径(目录或文件的全路径) [本地目录全路径] --username 用户名
- # 例子:
- SVN co SVN://localhost / 测试工具 /home/testtools --username wzhnsc
- SVN co http://localhost/test/testapp --username wzhnsc
- SVN checkout SVN://localhost / 测试工具 /home/testtools --username wzhnsc
- SVN checkouthttp://localhost/test/testapp --username wzhnsc
注: 如果不带 --password 参数传输密码的话, 会提示输入密码, 建议不要用明文的 --password 选项.
其中 username 与 password 前是两个短线, 不是一个.
不指定本地目录全路径, 则检出到当前目录下.
导出(导出一个干净的不带. SVN 文件夹的目录树)
SVN export [-r 版本号] http:// 路径(目录或文件的全路径) [本地目录全路径] --username 用户名
SVN export [-r 版本号] SVN:// 路径(目录或文件的全路径) [本地目录全路径] --username 用户名
SVN export 本地检出的 (即带有. SVN 文件夹的) 目录全路径 要导出的本地目录全路径
例子:
- SVN export SVN://localhost / 测试工具 /home/testtools --username wzhnsc
- SVN export SVN://localhost/test/testapp --username wzhnsc
- SVN export /home/testapp /home/testtools
注: 第一种从版本库导出干净工作目录树的形式是指定 URL,
如果指定了修订版本号, 会导出相应的版本,
如果没有指定修订版本, 则会导出最新的, 导出到指定位置.
如果省略 本地目录全路径, URL 的最后一部分会作为本地目录的名字.
第二种形式是指定 本地检出的目录全路径 到 要导出的本地目录全路径, 所有的本地修改将会保留,
但是不在版本控制下 (即没提交的新文件, 因为. SVN 文件夹里没有与之相关的信息记录) 的文件不会拷贝.
添加新文件
SVN add 文件名
注: 告诉 SVN 服务器要添加文件了, 还要用 SVN commint -m 真实的上传上去!
例子:
SVN add test.PHP <- 添加 test.PHP
SVN commit -m "添加我的测试用 test.php" test.PHP
SVN add *.PHP <- 添加当前目录下所有的 PHP 文件
SVN commit -m "添加我的测试用全部 php 文件" *.PHP
提交
SVN commit -m "提交备注信息文本" [-N] [--no-unlock] 文件名
SVN ci -m "提交备注信息文本" [-N] [--no-unlock] 文件名
必须带上 - m 参数, 参数可以为空, 但是必须写上 - m
例子:
SVN commit -m "提交当前目录下的全部在版本控制下的文件" * <- 注意这个 * 表示全部文件
SVN commit -m "提交我的测试用 test.php" test.PHP
SVN commit -m "提交我的测试用 test.php" -N --no-unlock test.PHP <- 保持锁就用 - no-unlock 开关
SVN ci -m "提交当前目录下的全部在版本控制下的文件" * <- 注意这个 * 表示全部文件
SVN ci -m "提交我的测试用 test.php" test.PHP
SVN ci -m "提交我的测试用 test.php" -N --no-unlock test.PHP <- 保持锁就用 - no-unlock 开关
更新文件
SVN update
SVN update -r 修正版本 文件名
SVN update 文件名
例子:
SVN update <- 后面没有目录, 默认将当前目录以及子目录下的所有文件都更新到最新版本
SVN update -r 200 test.cpp <- 将版本库中的文件 test.cpp 还原到修正版本(revision)200
SVN update test.PHP <- 更新与版本库同步.
提交的时候提示过期冲突, 需要先 update 修改文件,
然后清除 SVN resolved, 最后再提交 commit.
删除文件
SVN delete SVN:// 路径(目录或文件的全路径) -m "删除备注信息文本"
推荐如下操作:
SVN delete 文件名
SVN ci -m "删除备注信息文本"
例子:
SVN delete SVN://localhost/testapp/test.PHP -m "删除测试文件 test.php"
推荐如下操作:
SVN delete test.PHP
SVN ci -m "删除测试文件 test.php"
加锁 / 解锁
SVN lock -m "加锁备注信息文本" [--force] 文件名
SVN unlock 文件名
例子:
SVN lock -m "锁信测试用 test.php 文件" test.PHP
SVN unlock test.PHP
比较差异
SVN diff 文件名
SVN diff -r 修正版本号 m: 修正版本号 n 文件名
例子:
SVN diff test.PHP<- 将修改的文件与基础版本比较
SVN diff -r 200:201 test.PHP<- 对 修正版本号 200 和 修正版本号 201 比较差异
查看文件或者目录状态
SVN st 目录路径 / 名
SVN status 目录路径 / 名<- 目录下的文件和子目录的状态, 正常状态不显示
[?: 不在 SVN 的控制中; M: 内容被修改; C: 发生冲突;
A: 预定加入到版本库; K: 被锁定]
SVN -v 目录路径 / 名
SVN status -v 目录路径 / 名<- 显示文件和子目录状态
[第一列保持相同, 第二列显示工作版本号,
第三和第四列显示最后一次修改的版本号和修改人]
注: SVN status,SVN diff 和 SVN revert 这三条命令在没有网络的情况下也可以执行的,
原因是 SVN 在本地的. SVN 中保留了本地版本的原始拷贝.
查看日志
SVN log 文件名
例子:
SVN log test.PHP<- 显示这个文件的所有修改记录, 及其版本号的变化
查看文件详细信息
SVN info 文件名
例子:
SVN info test.PHP
SVN 帮助
SVN help <- 全部功能选项
SVN help ci <- 具体功能的说明
查看版本库下的文件和目录列表
- SVN list SVN:// 路径(目录或文件的全路径)
- SVN ls SVN:// 路径(目录或文件的全路径)
例子:
- SVN list SVN://localhost/test
- SVN ls SVN://localhost/test <- 显示 SVN://localhost/test 目录下的所有属于版本库的文件和目录
创建纳入版本控制下的新目录
SVN mkdir 目录名
SVN mkdir -m "新增目录备注文本" http:// 目录全路径
例子:
- SVN mkdir newdir
- SVN mkdir -m "Making a new dir." SVN://localhost/test/newdir
注: 添加完子目录后, 一定要回到根目录更新一下, 不然在该目录下提交文件会提示 "提交失败"
SVN update
注: 如果手工在 checkout 出来的目录里创建了一个新文件夹 newsubdir,
再用 SVN mkdir newsubdir 命令后, SVN 会提示:
SVN: 尝试用 "svn add" 或 "svn add --non-recursive" 代替?
SVN: 无法创建目录 "hello": 文件已经存在
此时, 用如下命令解决:
SVN add --non-recursive newsubdir
在进入这个 newsubdir 文件夹, 用 ls -a 查看它下面的全部目录与文件, 会发现多了:.SVN 目录
再用 SVN mkdir -m "添 hello 功能模块文件" SVN://localhost/test/newdir/newsubdir 命令,
SVN 提示:
- SVN: File already exists: filesystem '/data/svnroot/test/db', transaction '4541-1',
- path '/newdir/newsubdir'
恢复本地修改
SVN revert [--recursive] 文件名
注意: 本子命令不会存取网络, 并且会解除冲突的状况. 但是它不会恢复被删除的目录.
例子:
SVN revert foo.c <- 丢弃对一个文件的修改
SVN revert --recursive . <- 恢复一整个目录的文件,. 为当前目录
把工作拷贝更新到别的 URL
SVN switch http:// 目录全路径 本地目录全路径
例子:
SVN switch http://localhost/test/456 . <- (原为 123 的分支)当前所在目录分支到 localhost/test/456
解决冲突
SVN resolved [本地目录全路径]
例子:
- $ SVN update
- C foo.c
- Updated to revision 31.
如果你在更新时得到冲突, 你的工作拷贝会产生三个新的文件:
- $ ls
- foo.c
- foo.c.mine
- foo.c.r30
- foo.c.r31
当你解决了 foo.c 的冲突, 并且准备提交, 运行 SVN resolved 让你的工作拷贝知道你已经完成了所有事情.
你可以仅仅删除冲突的文件并且提交, 但是 SVN resolved 除了删除冲突文件, 还修正了一些记录在工作拷贝管理区域的记录数据, 所以我们推荐你使用这个命令.
不 checkout 而查看输出特定文件或 URL 的内容
SVN cat http:// 文件全路径
例子:
SVN cat http://localhost/test/readme.txt
19, 新建一个分支 copy
SVN copy branchA branchB -m "make B branch" // 从 branchA 拷贝出一个新分支 branchB
20, 合并内容到分支 merge
SVN merge branchA branchB // 把对 branchA 的修改合并到分支 branchB
1, 将文件 checkout 到本地目录
SVN checkout path(path 是服务器上的目录)
例如: SVN checkout SVN://192.168.1.1/pro/domain
简写: SVN co
2, 往版本库中添加新的文件
SVN add file
例如: SVN add test.PHP(添加 test.PHP)
SVN add *.PHP(添加当前目录下所有的 PHP 文件)
3, 将改动的文件提交到版本库
SVN commit -m "LogMessage" [-N] [--no-unlock] PATH(如果选择了保持锁, 就使用 --no-unlock 开关)
例如: SVN commit -m "add test file for my test" test.PHP
简写: SVN ci
4, 加锁 / 解锁
SVN lock -m "LockMessage" [--force] PATH
例如: SVN lock -m "lock test file" test.PHP
SVN unlock PATH
5, 更新到某个版本
SVN update -r m path
例如:
SVN update 如果后面没有目录, 默认将当前目录以及子目录下的所有文件都更新到最新版本.
- SVN update -r 200 test.PHP(将版本库中的文件 test.PHP 还原到版本 200)
- SVN update test.PHP(更新, 于版本库同步. 如果在提交的时候提示过期的话, 是因为冲突, 需要先 update, 修改文件, 然后清除 SVN resolved, 最后再提交 commit)
简写: SVN up
6, 查看文件或者目录状态
1)SVN status path(目录下的文件和子目录的状态, 正常状态不显示)
[?: 不在 SVN 的控制中; M: 内容被修改; C: 发生冲突; A: 预定加入到版本库; K: 被锁定]
2)SVN status -v path(显示文件和子目录状态)
第一列保持相同, 第二列显示工作版本号, 第三和第四列显示最后一次修改的版本号和修改人.
注: SVN status,SVN diff 和 SVN revert 这三条命令在没有网络的情况下也可以执行的, 原因是 SVN 在本地的. SVN 中保留了本地版本的原始拷贝.
简写: SVN st
7, 删除文件
SVN delete path -m "delete test fle"
例如: SVN delete SVN://192.168.1.1/pro/domain/test.PHP -m "delete test file"
或者直接 SVN delete test.PHP 然后再 SVN ci -m 'delete test file', 推荐使用这种
简写: SVN (del, remove, rm)
8, 查看日志
SVN log path
例如: SVN log test.PHP 显示这个文件的所有修改记录, 及其版本号的变化
9, 查看文件详细信息
SVN info path
例如: SVN info test.PHP
10, 比较差异
SVN diff path(将修改的文件与基础版本比较)
例如: SVN diff test.PHP
SVN diff -r m:n path(对版本 m 和版本 n 比较差异)
例如: SVN diff -r 200:201 test.PHP
简写: SVN di
11, 将两个版本之间的差异合并到当前文件
SVN merge -r m:n path
例如: SVN merge -r 200:205 test.PHP(将版本 200 与 205 之间的差异合并到当前文件, 但是一般都会产生冲突, 需要处理一下)
12,SVN 帮助
- SVN help
- SVN help ci
以上是常用命令, 下面写几个不经常用的
13, 版本库下的文件和目录列表
SVN list path
显示 path 目录下的所有属于版本库的文件和目录
简写: SVN ls
14, 创建纳入版本控制下的新目录
SVN mkdir: 创建纳入版本控制下的新目录.
用法: 1,mkdir PATH...
2,mkdir URL...
15, 恢复本地修改
SVN revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改).revert:
用法: revert PATH...
注意: 本子命令不会存取网络, 并且会解除冲突的状况. 但是它不会恢复
被删除的目录
16, 代码库 URL 变更
SVN switch (sw): 更新工作副本至不同的 URL.
用法: 1,switch URL [PATH]
2,switch --relocate FROM TO [PATH...]
1, 更新你的工作副本, 映射到一个新的 URL, 其行为跟 "svn update" 很像, 也会将
服务器上文件与本地文件合并. 这是将工作副本对应到同一仓库中某个分支或者标记的
方法.
2, 改写工作副本的 URL 元数据, 以反映单纯的 URL 上的改变. 当仓库的根 URL 变动
(比如方案名或是主机名称变动), 但是工作副本仍旧对映到同一仓库的同一目录时使用
这个命令更新工作副本与仓库的对应关系.
17, 解决冲突
SVN resolved: 移除工作副本的目录或文件的 "冲突" 状态.
用法: resolved PATH...
注意: 本子命令不会依语法来解决冲突或是移除冲突标记; 它只是移除冲突的
相关文件, 然后让 PATH 可以再次提交.
18, 输出指定文件或 URL 的内容.
SVN cat 目标[@版本]... 如果指定了版本, 将从指定的版本开始查找.
SVN cat -r PREV filename> filename (PREV 是上一版本, 也可以写具体版本号, 这样输出结果是可以提交的)
来源: https://www.jb51.net/article/190572.htm