1 前言 1.1 目的 本文档对SVN版本管理常用命令进行说明,这里只说明了常用的几个命令,如果要了解更多,可以参考官方文档。 1.2 术语与缩写词 暂无。 1.3 参考资料 SVN中文站:http://www.subversion.org.cn/svnbook/1.4/index.html 2 命令环境说明 假定SVN已经安装完成,SVN指示的版本库磁盘路径为D:\svn_repository,假设有项目project是SVN正在管理的一个项目,所在版本库磁盘路径D:\svn_repository\project。假设从本机访问版本库,SVN协议访问的地址为: svn://loccalhost:3690/project 注:端口3690依赖于安装时的配置。 如果配置了Apache服务器进行版本库访问,还可以在浏览器中访问: http://localhsot:800/svn/project 注:端口800依赖于Apache的配置。 3 基本操作命令 3.1 从版本库下载项目 svn checkout http://localhsot:800/svn/project 简写:svn co http://localhsot:800/svn/project 3.2 查看文件修改状态命令 svn status 可以简写为svn st 文件的修改可以有很多方面,比如内容、属性等等,指示文件状态的有七列,分别说明如下: 第一列指出一个项目的是添加、删除还是其它的修改。 ' ' 没有修改。 'A' 预定要添加的项目。 'D' 预定要删除的项目。 'M' 项目已经修改了。 'R' 项目在工作拷贝中已经被替换了。这意味着文件预定要删除,然后有一个同样名称的文件要在同一个位置替换它。 'C' 项目的内容(相对于属性)与更新得到的数据冲突了。 'X' 项目与外部定义相关。 'I' 项目被忽略(例如使用svn:ignore属性)。 '?' 项目不在版本控制之下。 '!' 项目已经丢失(例如,你使用svn移动或者删除了它)。这也说明了一个目录不是完整的(一个检出或更新中断)。 '~' 项目作为一种对象(文件、目录或链接)纳入版本控制,但是已经被另一种对象替代。 第二列告诉一个文件或目录的属性的状态。 ' ' 没有修改。 'M' 这个项目的属性已经修改。 'C' 这个项目的属性与从版本库得到的更新有冲突。 第三列只在工作拷贝锁定时才会出现。(见“有时你只需要清理”一节。) ' ' 项目没有锁定。 'L' 项目已经锁定。 第四列只在预定包含历史添加的项目出现。 ' ' 没有历史预定要提交。 '+' 历史预定要伴随提交。 第五列只在项目跳转到相对于它的父目录时出现(见“使用分支”一节)。 ' ' 项目是它的父目录的孩子。 'S' 项目已经转换。 第六列显示锁定信息。 ' ' 当使用--show-updates,文件没有锁定。如果不使用--show-updates,这意味着文件在工作拷贝被锁定。 K 文件锁定在工作拷贝。 O 文件被另一个工作拷贝的另一个用户锁定,只有在使用--show-updates时显示。 T 文件锁定在工作拷贝,但是锁定被“窃取”而不可用。文件当前锁定在版本库,只有在使用--show-updates时显示。 B 文件锁定在工作拷贝,但是锁定被“破坏”而不可用。文件当前锁定在版本库,只有在使用--show-updates时显示。 过期信息出现在第七列(只在使用--show-updates选项时出现)。 ' ' 这个项目在工作拷贝是最新的。 '*' 在服务器这个项目有了新的修订版本。 3.3 查看项目信息 svn info 3.4 增加新的文件到版本库 svn add file_name file_name是要增加的文件,如果是目录,将递归增加。 3.5 更新项目到最新的版本状态 svn up 3.6 解决版本冲突 svn up或者svn ci时,如果文件第一列显示C表示这个文件的服务器版本与本地版本冲突(文件状态参见3.2),冲突的文件需要手工解决,解决冲突后,使用命令svn resolved告诉svn冲突已经解决。 3.7 放弃对文件的修改 如果修改了一个文件后,之后并不想永久修改它,也不必提交,这时候可以撤销对文件的修改,使用如下命令: svn revert file_name 3.8 已修改的内容提交到版本库 svn commit –m “注释” 简写为svn ci –m “注释” 这条命令会提交所有的修改到版本库 3.9 更新列表的使用 有时候我们修改了很多文件,但是只想提交其中的一部分,这时候如果用svn ci命令提交,达不到这个目的。我们可以创建一个更新列表。 命令:svn changelist 简写svn cl 创建列表不需要专门创建,只要: svn cl changelist_name file_name 同时创建了列表changelist_name,然后把file_name加入列表。 如果要把其他文件加入这个列表,命令相同,但不会再次创建,只会做加入列表的动作。 这时候提交动作也只需要: svn --changelist changelist_name –m “注释” 简写为svn --cl changelist_name –m “注释” 3.10 查看版本更新日志 svn log 如果要查看指定版本的log,可以: svn log –r versionNo,比如svn log –r 20 如果要查看某个版本的log及修改文件清单,可以: svn log –r 20 –v 3.11 锁定文件 Svn的版本库理念是拷贝-修改-提交,与其他版本库的锁定-修改-提交概念不同,但是,如果你要修改一个文件,又不想别人修改时,可以使用svn lock命令,格式如下: svn lock file_name 这对于二进制文件尤其有意义,比如一张图片,如果两个人同时修改,提交时才发现冲突,将有一方的工作需要放弃,等到另一方提交后,再做修改。解决办法就是修改之前,锁定这个文件。如果,其他人修改时,svn会提示他这个文件已经被锁定,这样就可以避免徒劳无功。 关于这个命令可以参考http://www.subversion.org.cn/svnbook/1.4/index.html了解更多。 3.12 删除文件 如果要删除一个服务器文件,可以使用一下命令: svn delete file_name或svn del file_name 或svn remove file_name或svn rm file_name 3.13 重命名文件 如果想对服务器的文件或命令进行重命名,可以使用命令: svn move src_name dst_name或 svn mv src_name dst_name 或 svn rename src_name dst_name或 svn ren src_name dst_name 这个命令也可以把一个文件或目录移动到另外一个位置。 3.14 导出干净的版本 从版本库用svn checkout出的工作目录下有隐藏的.svn目录,如果要导出干净的文件进行生产或者其他环境发布,可以使用以下命令: svn export svn://localhost:3690/project 这个命令将导出最新版本。 如果要指定导出某个版本,可以增加参数-r,假定要导出第二十个版本: svn export –r 20 svn://localhost:3690/project 3.15 导出某个文件 有时候你可能想导出某个文件的某个版本,可以 svn export –r 20 svn://localhost:3690/project/file_path/file_name 3.16 版本比较 svn diff file_name比较一个本地修改和本地上个版本的差异。 如果要指定比较某两个版本,可以: svn diff –r 20:21 file_name 3.17 版本库地址切换 如果我们的版本库地址改变了,比如ip地址、机器名变更,原来的版本库地址可能是 svn://192.168.0.172:3690/project 或者 http:// 192.168.0.172:800/svn/project 现在变更为: svn://192.168.0.175:3690/project 或者 http:// 192.168.0.175:800/svn/project 每个人电脑上的工作目录的版本对应的访问地址也需要做相应的改变,可以使用命令: svn switch –relocate svn://192.168.0.172:3690/project svn://192.168.0.175:3690/project 或者 svn switch –relocate http:// 192.168.0.172:800/svn/project http:// 192.168.0.175:800/svn/project 其中switch可以简写为sw。 3.18 SVN版本布局 Svn版本库的推荐结构 /project /trunk /branches /tags /trunk目录是开发主目录 /branches目录是分支开发目录 /tags目录是标记目录 几个人的团队很少出现需要分支开发的情况,所以/branches基本上很少用。 每次上线,我们可能希望保留完成的上线版本文件,同时又能看到这个版本之前的历史 版本,/tags目录可以发挥作用。上线时,可用如下命令创建上线版本: svn copy svn://localhost:3690/project/trunk svn:// localhost:3690/project/branches/release_1.0 -m "第一个上线版本" 3.19 使用SVN管理的项目Eclipse/MyEclipse配置 在eclipse左侧Package Explorer视图上右击项目,选择属性,在弹出的属性窗口上单击Java Build Path,然后选择souce,如下图: 双击Excluded,如下图,点击Add… 输入**/.svn/**即可。 以上配置的目的是确保,.svn目录不会被编译到classes目录,否则可能会操作失误导致版本错乱。 3.20 创建版本库 打开cmd窗口,运行 svnadmin create d:/svn_repository/project project项目的版本库被创建。 3.21 导入项目到版本库 project项目的版本库创建后,需要把project项目纳入版本管理,命令: svn import d:/huilan/project file:///d:/svn_repository/prject -m "初始版本" 其中d:/huilan/project是project项目目录 file:///d:/svn_repository/prject是版本库目录 3.22 文件忽略 有时候用svn st查看文件状态,有很多临时文件或者不想纳入版本控制的文件出现在窗口中,混淆视听。如果有忽略某个类型的文件,比如*.bak、*.tmp、*.class,可以做如下配置: 在windows运行窗口运行%APPDATA%,然后进入subversion目录,打开config文件,去掉对global-ignores的注释,同时在后边添加*.bak *.temp *.class等希望忽略的文件类型。 3.23 访问权限 要控制访问权限,可以修改版本库的配置信息。 d:/svn_repository/prject/conf目录下的svnserve.conf 、passwd、authz就是控制访问权限的。 svnserve.conf anon-access = none匿名存取权限,none是不能匿名访问 auth-access = write授权访问权限,可写 password-db = passwd用户密码文件passwd authz-db = authz用户授权文件authz passwd 以键值对的形式记录用户和密码,比如 zhulin=zhulin 这就创建了一个用户zhulin密码为zhulin authz [groups] 用户组,有时候你想给你一群人分配相同的权限,这个就类似权限组,然后再给权限组赋相应的权限 [/project:] Project项目权限 以下创建了一个dev用户组,它包括两个用户zhulin,xiyf,他们的权限为read、write即读写,当然还可以创建别的用户组和用户,并赋予不同的权限。 [groups] dev=zhulin,xiyf [/project:] dev=rw 3.24 获得帮助 svn help或者svn h将列出svn可用子命令 svn h command_name将列出command_name 的使用说明 比如svn h add,看看效果如何。 |