分享
 
 
 

【Linux工具】svn命令行使用实例

王朝学院·作者佚名  2016-05-26
窄屏简体版  字體: |||超大  

【linux工具】svn命令行使用实例引言网上有这么多介绍 svn 使用的文章,为什么还要写?因为它们深入不浅出,平铺不分类,理论不实际,看完也记不住。

本文先介绍基本用法,后进行实例演练。不求大而全,只求熟练常用,自行用 svn help 举一反三(比如 -r 参数很多命令都有)。如果你有环境(别忘了还有服务器),不妨花十分钟跟着实例走一遍。

简介一下 svn:一种流行的版本管理工具。基于一个 svn 服务器,开发人员用各自的电脑安装 svn 客户端后,就可以实现代码托管、版本管理、协作开发等功能。Windows 上的 svn 客户端有著名的 TortoiseSVN,图形界面非常好用。Linux 众多发行版通常默认安装 svn 命令行客户端(本文介绍的内容)。当然 Linux 下诸如 Eclipse 工具也有图形界面的 svn 客户端插件,同样非常好用。

欢迎来到 lovickie 的博客http://www.cnblogs.com/lovickie

svn 命令行用法分类概览(中括号[] 内为可选参数)命令中的 PATH 参数既可是目录也可是文件。大多数命令都可省略 PATH,缺省为当前目录。有些命令可用 URL 代替 PATH。

-r 参数大多数命令都有,缺省 -r BASE。

欢迎来到 lovickie 的博客http://www.cnblogs.com/lovickie

1. 查看

svn help CMD # 查看 svn CMD 的帮助,注意 CMD 不含 -xx 之类的参数。

svn info PATH # 查看 PATH 路径的详细信息(URL、作者、BASE版本号、修改时间)

svn log PATH [-v] [-r HEAD/BASE/PREV/版本号] # 查看PATH 路径的提交日志,-v 含文件和子文件夹

# -r 指定版本,缺省 -r BASE

# HEAD 服务器上的最新版

# BASE 本地更新或提交的最新版

# PREV 前一版,BASE-1

svn cat PATH/URL [-r 版本] # 查看内容,-r 指定版本

svn di PATH [-r 版本A] [-r 版本A:版本B] # di=diff,查看版本A和本地的区别,或A和B的区别

svn di PATH/URL -c 版本B # B必须为数字,查看版本B-1和B的区别

svn ls PATH [-v] # ls=list,查看纳入版本的文件和子文件夹列表,-v 含本地最新提交记录

svn st PATH [-v] # st=state,查看本地尚未提交的修改,-v 与 svn ls PATH -v 类似

# A 增加,D 删除,M 修改,R 替换,C 冲突

# I 忽略,? 未纳入,! 异常修改,S 切换

2. 管理

svn co URL --username NAME # co=checkout,检出工作拷贝至本地当前目录

svn export URL # 导出至本地当前目录,非工作拷贝,目录中不含.svn

# 若当前目录有同名文件夹则失败

svn import PATH URL -m '提交日志' # 将本地目录 PATH 导入 URL,PATH 不变为工作拷贝

svn sw URL # sw=switch,将本地当前目录切换为 URL 的工作拷贝

svn lock PATH -m '提交日志' # 锁定为仅当前用户可修改

svn unlock PATH # 解锁,注意不能加 -m 参数

3. 修改

svn up PATH[-r 版本] # up=update,更新至本地,U 被更新,G 合并

# 若 C 冲突,则冲突文件*会被修改,并新增文件 *.rxxxx和*.r.mine

svn ci PATH -m '提交日志' # ci=commit,将本地修改提交至服务器,提交日志也可以用双引号

svn mkdir PATH # 新建目录 PATH 并纳入版本管理

svn add PATH # 将 PATH 新纳入版本管理

svn del(rm) PATH # del=delete,rm=remove,将 PATH 移除版本管理并删除

svn cp OLDPATH NEWPATH # cp=copy,复制

svn mv OLDPATH NEWPATH # mv=move,移动

svn revert PATH # 撤销本地修改(但被删除的目录无法恢复)

svn resolved PATH # 标记冲突已解决(并非解决冲突文件*,而是删除*.rxxxx和*.r.mine)

4.设置忽略属性

svn propset svn:ignore "FILE" PATH # 将 PATH 目录中的 FILE 设置为忽略 #多个 FILE 用回车区分,不能省略 PATH

svn propedit svn:ignore PATH # 编辑 PATH 目录中的忽略列表

# 之前需 export SVN_EDITOR=/usr/bin/vim

svn pget svn:ignore # 读取当前目录的忽略列表

svn plist # 查看当前目录的属性,如果设置了忽略则显示 svn:ignore

欢迎来到 lovickie 的博客http://www.cnblogs.com/lovickie

svn 命令行使用例子假设 http://path 为服务器原有目录。

欢迎来到 lovickie 的博客http://www.cnblogs.com/lovickie

1. 检出工作拷贝 pathsvn co http://path --username lovickie #检出工作拷贝至本地当前目录

cd path # 应 cd path的最子目录,下同

svn info

svn log -v -r HEAD

svn ls -v

2. 创建目录 path/newdir

2.1 创建目录方法一:直接操作服务器目录

svn mkdir http://path/newdir -m '创建目录' # 直接在服务器上创建目录

cd path

svn up . # 更新至本地

2.2 创建目录方法二:在本地工作拷贝上操作后提交至服务器

cd path

svn mkdir newdir # 也可以 mkdir newdir 然后 svn add newdir

svn st # 显示 A newdir

svn ci newdir -m '创建目录' # 提交修改

svn st # 无显示,因为本地所有修改均已提交

svn st -v # 显示 A newdir

svn log -v -r HEAD # 显示 A newdir,'创建目录'

3. 删除目录 path/newdir/dir1

3.1 删除目录的准备工作:创建目录 path/newdir/dir1 和 path/newdir/dir1/a.c

cd path/newdir

mkdir dir1

vim dir1/a.c # 保存退出,下同

svn add dir1 # 显示 A dir1,A dir1/a.c

svn ci -m '创建待删除目录dir1和文件a.c'

3.2 删除目录方法一:直接操作服务器目录

svn del http://path/newdir/dir1 -m '删除dir1' # 直接在服务器上删除目录

cd path/newdir

svn up # 更新至本地

3.3 删除目录方法二

svn rm dir1

svn st # 显示 D dir1,D dir1/a.c

svn ci -m'删除dir1' # 提交修改

svn st # 无显示

svn st -v

svn log -v -r HEAD

svn up # 将删除目录信息更新至本地,重要!

svn st -v # 显示D dir1,D dir1/a.c

svn log -v -r HEAD # 显示 D dir1,D dir1/a.c,'删除dir1'

3.4 在删除目录后 svn up 的作用不仅仅是让状态刷成最新版本,而且能避免“莫名其妙”的提交失败

cd path/newdir

svn mkdir dir2

svn ci -m '新建dir2'

pushd dir2

vim b.c

svn add b.c

svn ci -m '新增b.c'

popd

svn del dir2

svn ci -m '删除dir2' # 报错

svn up

svnci -m '删除dir2' # 成功提交

4. 复制目录 path/newdir/dir3,移动目录 path/newdir/dir4

4.1 复制目录的准备工作:创建目录 path/newdir/dir3 和 path/newdir/dir3/c.c

cd path/newdir

svn mkdir dir3

vim dir3/c.c

svn ci -m '创建目录dir3和文件c.c'

4.2 复制与移动目录

cd path/newdir

svn cp dir3 dir4 # 将 dir3 复制到 dir4

svn mv dir4 dir5 # 失败,除非先提交,注意 --force 也不行

svn ci -m '复制dir3到dir4'

svn mv dir4 dir5 # 成功将 dir4 移动到 dir5

svn del dir5 # 失败,除非先提交

svn del dir5 --force # 成功删除 dir5

svn ci -m '变相删除了dir4'

5. 撤销本地修改 path/newdir/dir3

5.1 撤销修改的准备工作:假设 path/newdir/dir3/c.c 已建立并提交

svn lspath/newdir/dir3/c.c

5.2 撤销文件修改 dir3/c.c

cd path/newdir

vim dir3/c.c # 随便做些修改

svn st # 显示 M dir3/c.c

svn revert # 失败,参数不完整

svn revert . # 成功,但操作对象是目录.而非文件dir3/c.c

svn st # 仍显示 M dir3/c.c

svn revert dir3/c.c # 成功撤销修改dir3/c.c

svn st # 无显示

5.3 撤销文件删除 dir3/c.c

cd path/newdir

rm -f dir3/c.c

svn st # 因为未采用 svn rm,显示 ! dir3/c.c

svn revert dir3/c.c # 成功撤销删除 dir3/c.c

svn st # 无显示

5.4 撤销目录删除 dir3

cd path/newdir

rm -rf dir3

svn st # 显示 ! dir3

svn revert dir3 # 失败,删除目录无法用 revert 恢复

svn up # 从服务器更新可恢复被删除的一切目录和文件

欢迎来到 lovickie 的博客http://www.cnblogs.com/lovickie

6. 解决冲突 path/newdir/dir3/c.c

6.1解决冲突的准备工作:假设 path/newdir/dir3/c.c 已建立并提交

svn lspath/newdir/dir3/c.c

6.2 解决别处提交删除导致的冲突

cd 一个新的本地目录 # 注意该目录下不能有 dir3

svn co http://path/newdir/dir3

svn del dir3/c.c

svn ci -m '在别处删除dir3/c.c'

cd path/newdir/dir3

vim c.c # 随便做些修改

svn ci -m '不知道c.c已被别处删除,尝试提交对c.c的修改' # 失败

svn log -v -r HEAD # 显示 D c.c,'在别处删除dir3/c.c'

svn up

svn st # 显示 ? c.c,即 c.c 未纳入版本管理

svn add c.c # 解决冲突:重新添加 c.c,气死另一位提交者

svn ci -m '喂不要再删除c.c了' # 若仍失败说明又有人抢先提交了

6.3 解决别处提交修改导致的冲突

cd 一个新的本地目录 # 注意该目录下不能有 dir3

svn co http://path/newdir/dir3

vim dir3/c.c # 修改如下,新增一行:printf ("别处修改\n");

#include <stdio.h>int main (){ printf ("别处修改\n"); return 0;}

svn ci -m '在别处修改dir3/c.c'

svn info # 显示版本号2001

cd path/newdir/dir3

svn info # 显示版本号2000

vim c.c # 修改如下,新增两行:printf ("本处修改"); printf ("\n");

#include <stdio.h>int main (){ printf ("本处修改"); printf ("\n"); return 0;}

svn ci -m '不知道c.c已被别处修改,尝试提交对c.c的修改' # 失败

svn log -v -r HEAD # 显示 M c.c,'在别处修改dir3/c.c',注意缺省是 -r BASE

svn cat c.c -r BASE # 查看BASE=2000版内容

svn cat c.c -r HEAD # 查看HEAD=2001版内容

svn di -r BASE:HEAD # 2000:2001,显示 BASE 与 HEAD 的差别

svn di [-r BASE] # 显示 BASE=2000版与本地修改的差别

svn di-r HEAD # 显示 HEAD=2001版与本地修改的差别,如下

Index: c.c=========================--- c.c (修订版 2001)+++ c.c (工作拷贝)@@ -3,5 +3,6 @@{-printf ("别处修改\n");+printf ("本处修改");+printf ("\n");}

svn up

svn st # 显示 ? c.c.r2000,本地更新或提交的最新版BASE

# ? c.c.r2001,服务器上的最新版HEAD,printf ("别处修改\n");

# ? c.c.mine,本地修改,printf ("本处修改"); printf ("\n");

# C c.c,冲突文件,若为U更新、G合并则不用解决,c.c 内容如下

#include <stdio.h>int main (){<<<<<<< .mine printf ("本处修改"); printf ("\n");======= printf ("别处修改\n");>>>>>>> .r2001 return 0;}

vim c.c # 手动修改解决冲突

svn resolved c.c # 删除 c.c.*,标记冲突已解决

svn st # 显示 M c.c

svn ci -m '解决c.c的修改冲突' # 生成版本2002

6.4 详解 svn di PATH -r A:B 或 -r A(B为本地尚未提交)或 -c B(A=B-1)的输出格式

Index: 有差别的文件 c.c=========================--- c.c (修订版 A)+++ c.c (修订版 B)@@ -3,5 +3,6 @@ # 以下显示版本A的3~5行,版本B的3~6行版本AB的相同内容-版本A的独有内容+版本B的独有内容版本AB的相同内容

注意:当 svn di [-r BASE] 时,显示 --- (修订版 2000),+++ (工作拷贝);

当 svn di -r BASE:HEAD 时,显示--- (工作拷贝),+++ (修订版 2001)。

“工作拷贝”在上面两处的含义不同!

欢迎来到 lovickie 的博客http://www.cnblogs.com/lovickie

7.加锁与解锁 path/newdir/dir3/c.c

7.1加锁的准备工作:假设 path/newdir/dir3/c.c 已建立并提交

svn lspath/newdir/dir3/c.c

7.2 加锁与解锁

cd path/newdir

svn lock dir3/c.c -m '用户lovickie锁定c.c' # 加锁

svn unlock dir3/c.c # 解锁,加 -m 则失败

8.导出与导入

8.1导出 path/newdir

cd 一个新的本地目录 # 注意该目录下不能有 newdir

svn export http://path/newdir [-r HEAD] # 当前目录生成的 newdir 中不含.svn,非工作拷贝8.2导入 path/newdir/dir6/d.c

cd 一个新的本地目录

mkdir dir6

vim dir6/d.c

svn importdir6 http://path/newdir -m '导入dir6中的内容' # 即只导入了 d.c

8.3导入 path/newdir/dir7

cd 一个新的本地目录

mkdir dir7vim dir7/e.c

svn importdir7 http://path/newdir/dir7 -m '导入dir7' # 即导入了 dir7 和 dir7/e.c

8.4检验导入结果cd path/newdir

svn up # 显示 A d.c,A dir7,A dir7/e.c

9 切换工作拷贝 path/newdir/dir8

9.1切换工作拷贝的准备工作:假设 path/newdir/dir7/e.c 已建立并提交

svn lspath/newdir/dir7/e.c

9.2 切换工作拷贝cd path/newdir

mkdir dir8

vim dir8/f.c

svn add dir8

svn ci -m '新建dir8'

cd dir8

svn sw http://path/newdir/dir7 # 切换本目录为 dir7 的工作拷贝

svn ls # 显示 e.c

svn st path/newdir # 显示 S dir8

9.3 恢复原工作拷贝(不能revert)

cd path/newdir

rm -rf dir8

svn up

svn ls dir8 # 显示 f.c

欢迎来到 lovickie 的博客http://www.cnblogs.com/lovickie

10 设置忽略path/newdir/dir3

10.1设置忽略的准备工作:假设 path/newdir/dir3 已建立并提交

svn lspath/newdir/dir3

cd path/newdir/dir3

vim a.out

vim a.o

vim b.obj

svn st # 显示 ?a.out,? a.o,? b.obj

10.2 设置忽略文件

cd path/newdir/dir3

svn propset svn:ignore"a.out

> *.o

> *.obj" ./ # 注意不能省略最后的./或.,多个忽略文件用回车分隔(>是自动生成的提示符)

svn st # 无显示,表明忽略列表设置成功

export SVN_EDITOR=/usr/bin/vim # 否则无法执行svn propedit

svn propedit svn:ignore./ # 编辑当前目录的忽略列表,保存退出后生效

svn pget svn:ignore # 读取当前目录的忽略列表,显示a.out *.o *.obj

svn plist # 显示 svn:ignore

11 合并(svn merge)

该功能太浪,不建议在未完全掌握时使用。欢迎来到 lovickie 的博客http://www.cnblogs.com/lovickie

结语有什么地方写得不对的或者描述得不清楚的,欢迎留言指出,我会改正和改进。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有