之前的项目因为环境是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 !