linux下svn常用操作

本文介绍了SVN(Subversion)的基本概念及其常用命令操作,包括检出、提交、更新等,并详细解释了解决代码冲突的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前的项目因为环境是linux下,所以用了svn作为代码管理的工具。

由于svn服务器是已经搭建好了的,所以下面仅就svn的一些常见操作做个简介。




============================================
简介:


SVN的全称是subversion,是一个版本控制工具,
官方网站: http://subversion.apache.org/packages.html
中文社区: http://www.subversion.org.cn/svnbook/1.4/index.html


假设一台server上安装了SVN server, 版本库地址:svn//10.10.10.10/MyTest

已创建用户名:benjamin
密码:                123456


下面是客户端的操作:

============================================
step 1: 安装与配置

On CentOS:
yum install subversion

On Ubuntu:
apt-get install subversion


============================================
step 2: 如何使用
如何像SourceSafe一样使用?恐怕不行,因为官方版本SVN的使用需要在terminal中输入命令(如果想使用UI,需要自己安装一些别的插件),下面我将对一些常用命令做出介绍并给出简单例子。


PS:如果遇到以下错误:.....
svn: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options
svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no 'editor-cmd' run-time configuration option was found .....
则需要配置SVN_EDITOR或者使用 -m命令
配置SVN_EDITOR: export SVN_EDITOR=gedit
建议使用: svn xxx xxxx ... -m "[log内容]" //log内容可写可不写

————————————————————————————————————————————————————————
*********************************************************
1,检出/同步 服务器数据到本地: checkout或co
//可添加 --version [versionNO.] 或 -r [versionNO.]来获取指定版本的文件

命令: svn checkout <url> [directory]
或: svn co <url> [directory]
例如:将svn//10.10.10.10/MyTest上的内容检出到本地的Desktop/
# cd Desktop/
# svn co svn//10.10.10.10/MyTest


......
Password for 'benjamin': <回车> //benjamin是当前登录系统的帐号
Authentication realm: <svn//10.10.10.10/MyTest>  Subversion Repository
Username: xxxx //svn server 上创建的用户名 
//参见简介
Password for 'xxxx': <password> //123456
......
//第一次使用的时候需要输入svn用户名和密码,只要输入正确,
//以后就不需要输入了
这时Desktop/下会有一个MyTest的文件夹,这就是所谓的working copy,工作拷贝


————————————————————————————————————————————————————————
*********************************************************
2,导入本地未版本化的数据到服务器: import
命令: svn import [local_path] [server_dir] -m "log"

例如: 将usr/workplace/Database_Interface_Implement 上的内容导入到服务器svn//10.10.10.10/MyTest/Benjamin/dbApiImplement目录下:
# svn import usr/workplace/Database_Interface_Implement svn//10.10.10.10/MyTest/Benjamin/dbApiImplement -m "init import"
或者:
# cd usr/workplace/
# svn import usr/workplace/Database_Interface_Implement svn//10.10.10.10/MyTest/Benjamin/dbApiImplement -m ""

————————————————————————————————————————————————————————
*********************************************************
3,提交/上传本地文档到服务器: commit或ci
//相当于sourcesafe的checkin,前提是服务器上已经有该文件
//提交之前需要更新,命令: svn up或者svn update

命令:   svn commit -m "" [directory|file]
或: svn ci -m "" [directory|file]
或: svn ci -m "" //在工作拷贝路径下可用于提交被修改文件

例如:我修改了Desktop/MyTest/testMkdir/
# cd Desktop/MyTest/testMkdir
# svn ci database.h -m "input what U want record"
结果如下:
# Sending        database.h
# Transmitting file data .
# Committed revision 12.

————————————————————————————————————————————————————————
********************************************************
4,列出服务器版本库文件和目录: list
命令: svn list [server_dir]

例如: 列出svn//10.10.10.10/MyTest/Benjamin/dbApiImplement下目录和文件:
# svn list svn//10.10.10.10/MyTest/Benjamin/dbApiImplement
结果如下:
# .cproject
.project
Debug/
src/

————————————————————————————————————————————————————————
*********************************************************
5,创建版本控制下的文件夹: mkdir

命令: svn mkdir [DirName]
//需在工作拷贝下执行

例如:在工作拷贝Desktop/MyTest/下创建文件夹Benjamin/

输入:
# svn mkdir Benjamin
结果:
# A         Benjamin

//更新
# svn up
结果:
# At revision 7.
//保存修改
# svn ci -m "create folder"
结果:
# Adding         Benjamin
# Committed revision 8.


————————————————————————————————————————————————————————
*********************************************************
6,文件和文件夹的重命名: move或者mv
//svn不支持调用OS对文件和文件夹重命名,需用move命令
命令: svn move [file|folder name] [new name]
或: svn mv [file|folder name] [new name]

例如: 重命名Desktop/MyTest/Benjamin下文件夹databaseAPI为dbApiImplement

输入:
# svn move databaseAPI dbApiImplement
结果:
# A         dbApiImplement
# D         databaseAPI
//更新:
# svn up
结果:
# At revision 8.
//保存修改到server:
# svn ci -m ""
结果:
# Adding         Benjamin/dbApiImplement
# Committed revision 9.


————————————————————————————————————————————————————————
*********************************************************
7,删除或者添加文件
//在checkout出来的working copy中,直接添加或删除文件不会被自动同步到server端,需用调用delete/del 和 add 命令
命令:
添加: # //创建文件
# svn add [FileName]
# svn ci -m "[log]"

删除: # svn del [FileName]
# svn commit -m "[log]"


————————————————————————————————————————————————————————
********************************************************
8,更新到某个版本: update
//默认是更新到最新版
# svn up 或者 svn update
//更新到某个版本
//默认更新当前目录及子目录到指定版本号
# svn up -r [versionNO.]

//更新指定文件/文件夹到指定版本
# svn up [file|folder name] -r [versionNO.]

————————————————————————————————————————————————————————
********************************************************

9,获得修改版本信息和详细信息:
获得修改版本信息:
# svn log [file|folder name]
获得特定版本:
# svn log [file|folder name] -r [versionNO.]
获得特定的两个版本间信息:
# svn log [file|folder name] -r [versionNO.1]:[versionNO2]
获得详细信息:
# svn info [file|folder name]

————————————————————————————————————————————————————————
********************************************************
10,比较不同版本间差异:
比较指定版本间:
# svn diff [file|folder name] -r [versionNO.1]:[versionNO2]
工作拷贝与缓存中初始拷贝比较:
# svn diff 
比较工作拷贝与版本库:
# svn diff -r [versionNO.] [file|folder]

————————————————————————————————————————————————————————
********************************************************
11,如何取消或者恢复对代码的修改
分两种情况:
1)修改尚未被提交
# svn revert [filename]
或者: # svn revert [-r] [foldername]//r means recursive

2)修改已被提交
# svn update
# svn log [file|folder name]
# svn merge -r [latestVersion]:[oldVersion] [file|folder name]
# svn commit -m "revert from xxx to xxx"


————————————————————————————————————————————————————————
********************************************************
12,如何解决代码冲突
例如:
用户B如下操作:
# svn up
At revision 18. //与A用户同时更新到版本18
# svn ci -m "testM"
Sending        database.h //修改了该文件并提交成功
Transmitting file data .
Committed revision 19. //版本变成19


用户A如下操作:
# svn up
At revision 18. //与B用户同时更新到版本18
# svn ci -m "testMa" //提交失败
Sending        testMkdir/database.h
Transmitting file data .svn: Commit failed (details follow):
svn: File '/testMkdir/database.h' is out of date

//svn 同时版本过旧,B想更新后再提交:
# svn up
Conflict discovered in 'database.h'.
//发生冲突,svn show出如下是冲突解决选项:
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: 
//输入 s 显示全部选项和帮助信息:
(e)  edit             - change merged file in an editor
(df) diff-full        - show all changes made to merged file
(r)  resolved         - accept merged version of file


(dc) display-conflict - show all conflicts (ignoring merged version)
(mc) mine-conflict    - accept my version for all conflicts (same)
(tc) theirs-conflict  - accept their version for all conflicts (same)


(mf) mine-full        - accept my version of entire file (even non-conflicts)
(tf) theirs-full      - accept their version of entire file (same)


(p)  postpone         - mark the conflict to be resolved later
(l)  launch           - launch external tool to resolve conflict
(s)  show all         - show this list

//输入df显示所有冲突信息
--- .svn/text-base/database.h.svn-base Thu Sep 13 23:13:52 2012
+++ .svn/tmp/database.h.8.tmp Thu Sep 13 23:43:45 2012
@@ -96,6 +96,10 @@
extern int db_create_folder(const char *userName, const char *password,
  const char *client_name, const char *folder_path);
 
-//test t1
+<<<<<<< .mine
+//test tA
+=======
+//test tB
+>>>>>>> .r19
 
#endif


推荐解决方案:
// 参考文档:http://www.logicaltrinkets.com/wordpress/?p=178
输入 p
Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options: p
C    database.h
Updated to revision 19.
Summary of conflicts:
Text conflicts: 1
此时,工作拷贝下有4个文件:
database.h
database.h.mine //当前用户的copy
database.h.r18 //原始copy
database.h.r19 //另一用户B修改后提交版本的copy

输入:
# svn resolve --accept working database.h
//删除了文件:database.h.mine,database.h.r18,database.h.r19
结果:
Resolved conflicted state of 'database.h'

输入命令再次提交修改:
# svn ci -m "testMa"
结果如下:
Sending        testMkdir/database.h
Transmitting file data .
Committed revision 20.
WellDone!提交成功。

That's all !







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值