SVNKit开发手册
一、SVN快速入门
本文主要介绍在windows下使用的方式,对于UNIX环境下,区别并不大。
介绍的具体步骤如下:
l 软件下载
l 服务器和客户端安装
l 建立版本库(Repository)
l 配置用户和权限
l 运行独立服务器
l 初始化导入
l 基本客户端操作
1、软件下载
下载Subversion服务器程序
到官方网站的下载二进制安装文件,来到二进制包下载部分,找到 Windows NT, 2000, XP and 2003部分,然后选择" this directory ",这样我们可以看到许多下载的内容,目前可以下载 svn-1.4.0-setup.exe。
下载Subversion的Windows客户端TortoiseSVN
TortoiseSVN是扩展WindowsShell的一套工具,可以看作Windows资源管理器的插件,安装之后Windows就可以识别Subversion的工作目录。
官方网站是TortoiseSVN,下载方式和前面的svn服务器类似,在Download页面的我们可以选择下载的版本,目前的最高稳定版本的安装文件为TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi。
另外,subversion有相应的eclipse插件,通过此插件可以在eclipse集成开发环境中对开发项目进行版本管理。在这里暂不做介绍。
2、服务器和客户端安装
服务器安装,直接运行svn-1.4.0-setup.exe,根据提示安装即可,这样我们就有了一套服务器可以运行的环境。
安装TortoiseSVN,同样直接运行TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi按照提示安装即可,不过最后完成后会提示是否重启,其实重启只是使svn工作拷贝在windows中的特殊样式生效,与所有的实际功能无关,这里为了立刻看到好的效果,还是重新启动机器。
3、建立版本库(Repository)
运行Subversion服务器需要首先要建立一个版本库(Repository),可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接运行,如:
svnadmin create E:\svndemo\repository
就会在目录E:\svndemo\repository下创建一个版本库。
我们也可以使用TortoiseSVN图形化的完成这一步:
在目录E:\svndemo\repository下"右键->TortoiseSVN->CreateRepository here...“, 然后可以选择版本库模式, 这里使用默认即可, 然后就创建了一系列目录和文件。
4、配置用户和权限
来到E:\svndemo\repository\conf目录,修改svnserve.conf:
# [general]
# password-db = passwd
改为:
[general]
password-db = passwd
然后修改同目录的passwd文件,去掉下面三行的注释:
# [users]
# harry = harryssecret
# sally = sallyssecret
最后变成:
[users]
harry = harryssecret
sally = sallyssecret
5、运行独立服务器
在任意目录下运行:
svnserve -d -r E:\svndemo\repository 我们的服务器程序就已经启动了。注意不要关闭命令行窗口,关闭窗口也会把svnserve停止。
也可以把其设置为windows服务。
6、初始化导入
来到我们想要导入的项目根目录,在这个例子里是E:\svndemo\initproject,目录下有一个readme.txt文件:
右键->TortoiseSVN->Import...
URL of repository输入“svn://localhost/”
ok
完成之后目录没有任何变化,如果没有报错,数据就已经全部导入到了我们刚才定义的版本库中。
需要注意的是,这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/”。
7、基本客户端操作
取出版本库到一个工作拷贝:
来到任意空目录下,在本例中是E:\svndemo\wc1,运行右键->Checkout,在URLof repository中输入svn://localhost/,这样我们就得到了一份工作拷贝。
在工作拷贝中作出修改并提交:
打开readme.txt,作出修改,然后右键->Commit...,这样我们就把修改提交到了版本库,我们可以运行。
察看所作的修改:
readme.txt上右键->TortoiseSVN->Show Log,这样我们就可以看到我们对这个文件所有的提交。在版本1上右键->Comparewith working copy,我们可以比较工作拷贝的文件和版本1的区别。
二、SVNKit开发环境
1、 开发环境准备
SVN服务器版本我们选择比较稳定的版本Subversion1.4,安装在windows操作系统上。
SVNKit我们选择1.3.0版本,此版本支持Subversion1.6以下的所有版本。
2、开发环境配置
在开发环境中创建好项目后,在类路径中加上SVNKit的jar包即可开始对subversion进行相关的操作。Jar包有trilead.jar,svnkit-javahl.jar,svnkit-cli.jar,svnkit.jar和jna.jar。
三、SVNKit的结构
SVNKit是一个纯Java的subversion客户端库,使用SVNKit无需安装任何subversion客户端,支持各种操作系统。
四、SVNKit类关系图
SVNKit的API主要分为两类:High Level API和Low Level API。
通常情况下,我们使用High Level API即可完成工作任务。High Level API通过封装、使用Low Level API,使开发工作变得相对简单、容易。在此我们重点介绍High Level API。
High Level API介绍:
在High LevelAPI中,我们通过SVNClientManager类即可访问很多接口,这些接口几乎允许subversion用户执行可能需要的任何工作。这些工作包括:checking out、更新、提交、获取历史版本、比较版本间的差异、浏览存储库等等。类图如下图所示:
通过类图我们可以看到,通过SVNClientManager类可以获得各种client操作类的引用,进而可以执行很多操作。
接下来,对client操作类进行分别介绍:
SVNLogClient:
通过此类可以获得版本修订历史记录、浏览存储库条目、文件内容注释。
doLog(…) 用来获取版本的修订历史
doList(…) 用来获取存储库条目树
doAnnotate(…) 用来获取文件内容注释
SVNLogClient的方法和SVN命令行客户端的命令的对应关系。
SVNKit | Subversion |
doLog() | 'svn log' |
doList() | 'svn list' |
doAnnotate() | 'svn blame' |
SVNUpdateClient:
通过此类可以checkout、更新、切换工作副本,也可以从存储库中导出目录或文件。
doCheckOut(…)从存储库中检出工作副本。
doUpdate(…)把工作副本更新为最新版本或某个指定版本。
doSwitch(…)把工作副本更新为同一个存储库的不同分支上的版本。
doExport(..)从存储库中导出目录或文件。
doRelocate()把工作副本更新为不同的存储库中的版本。
SVNUpdateClient的方法和SVN命令行客户端的命令的对应关系。
SVNKit | Subversion |
doCheckout() | 'svn checkout' |
doUpdate() | 'svn update' |
doSwitch() | 'svn switch' |
doRelocate() | 'svn switch --relocate oldURL newURL' |
doExport() | 'svn export' |
SVNWCClient:
此类提供了许多和本地工作副本相关的操作,同时也能访问存储库。
doAdd(…)添加文件、目录到工作副本并且预定添加到存储库。它们会在下次提交上传并添加到存储库中。
doDelete(…)从工作副本中删除一个文件或目录。它们会在下次提交上传并添加到存储库中。
doCleanup(…)递归清理工作副本,删除未完成的工作副本锁定,并恢复未完成的操作。
doInfo(…)获取一个工作副本条目的信息。
doLock(…)锁定工作副本或存储库中的条目,使其他用户不能对条目进行修改。
doUnlock(…)解锁工作副本或存储库中的条目。
doSetProperty(…)对工作副本或存储库中的条目设置属性名和属性值。
doSetrevisionProperty(…)对修订版本的条目设置属性名和属性值。
doGetProperty(…)获得工作副本或存储库中条目的属性值。
doGetRevisionProperty(…)获得修订版本中的条目的属性值。
doRevert(…)取消所有本地编辑。
SVNWCClient的方法和SVN命令行客户端的命令的对应关系。
SVNKit | Subversion |
doAdd() | 'svn add' |
doDelete() | 'svn delete' |
doCleanup() | 'svn cleanup' |
doInfo() | 'svn info' |
doLock() | 'svn lock' |
doUnlock() | 'svn unlock' |
doSetProperty() | 'svn propset PROPNAME PROPVAL PATH' |
doSetRevisionProperty() | 'svn propset PROPNAME --revprop –r REV PROPVAL [URL]' |
doGetProperty() | 'svn propget PROPNAME PATH' |
doGetRevisionProperty() | 'svn propget PROPNAME --revprop –r REV [URL]' |
doResolve() | 'svn resolved' |
doRevert() | 'svn revert' |
SVNStatusClient:
此类用来获取工作副本条目(文件或目录)的状态信息。
doStatus(…)获得一个工作副本条目的状态。
SVNStatusClient的方法和SVN命令行客户端的命令的对应关系。
SVNKit | Subversion |
doStatus() | 'svn status' |
SVNCommitClient:
此类提供了把改变提交到存储库上的一些操作。
doCommit(…)将修改从工作副本提交到存储库。
doImport(…)递归提交一个路径(本地目录)到存储库。
doDelete(…)从存储库中删除一个条目。
doMkDir(…)在存储库中创建一个目录。
SVNCommitClient的方法和SVN命令行客户端的命令的对应关系。
SVNKit | Subversion |
doCommit() | 'svn commit' |
doImport() | 'svn import' |
doDelete() | 'svn delete URL' |
doMkDir() | 'svn mkdir URL' |
SVNMoveClient:
此类提供文件在工作副本内移动、取消移动等操作。
doMove(…)把源条目移动到目的条目。
undoMove(…)取消上次的移动操作。
doVirtualCopy(…)复制或移动源文件的版本控制信息到目的文件。
SVNCopyClient:
此类可提供SVN支持的任何复制和移动操作。
doCopy(…)
SVNDiffClient:
此类提供比较不同版本间的差异和合并差异的方法。
doDiff(…)获取两个版本间的差异。
doMerge(…)合并两组文件间的差异。
SVNDiffClient的方法和SVN命令行客户端的命令的对应关系。
SVNKit | Subversion |
doDiff() | 'svn diff' |
doMerge() | 'svn merge' |
五、程序框架
首先新建java项目,把SVNKit的jar包放到项目的类路径下面。
Jar包有trilead.jar,svnkit-javahl.jar,svnkit-cli.jar,svnkit.jar和jna.jar。
程序框架如下所示:
/*第一步:
*导入可能用到的类
*/
import java.io.*;
importorg.tmatesoft.svn.core.*;
import org.tmatesoft.svn.core.wc.*;
importorg.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
importorg.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
importorg.tmatesoft.svn.core.internal.util.SVNPathUtil;
public class Demo {
/*第二步:
*声明客户端管理类SVNClientManager。
*/
private static SVNClientManager ourClientManager;
public static void main(String[] args) throws SVNException {
/*第三步:
* 对版本库进行初始化操作 (在用版本库进行其他操作前必须进行初始化)
* 对于通过使用 http:// 和 https:// 访问,执行DAVRepositoryFactory.setup();
* 对于通过使用svn:// 和 svn+xxx://访问,执行SVNRepositoryFactoryImpl.setup();
* 对于通过使用file:///访问,执行FSRepositoryFactory.setup();
* 本程序框架用svn://来访问
*/
SVNRepositoryFactoryImpl.setup();
/*第四步:
* 要访问版本库的相关变量设置
*/
//版本库的URL地址
SVNURL repositoryURL = null;
try {
repositoryURL =SVNURL.parseURIEncoded("svn://localhost/testRep");
} catch (SVNException e) {
//
}
//版本库的用户名
String name = "userName";
//版本库的用户名密码
String password = "userPassword";
//工作副本目录
String myWorkingCopyPath = "D:/MyWorkingCopy";
//驱动选项
ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
/*第五步:
* 创建SVNClientManager的实例。提供认证信息(用户名,密码)
* 和驱动选项。
*/
ourClientManager =SVNClientManager.newInstance((DefaultSVNOptions)options, name, password);
/*第六步:
* 通过SVNClientManager的实例获取要进行操作的client实例(如 * SVNUpdateClient)
* 通过client实例来执行相关的操作。
* 此框架以check out操作来进行说明,其他操作类似。
*/
/*工作副本目录创建*/
File wcDir = new File(myWorkingCopyPath);
if (wcDir.exists()) {
error("the destination directory '"
+ wcDir.getAbsolutePath() +"' already exists!", null);
}
wcDir.mkdirs();
try {
/*
* 递归的把工作副本从repositoryURLcheck out 到 wcDir目录。
* SVNRevision.HEAD 意味着把最新的版本checked out出来。
*/
SVNUpdateClientupdateClient = ourClientManager.getUpdateClient();
updateClient.setIgnoreExternals(false);
updateClient.doCheckout(repositoryURL,wcDir,SVNRevision.HEAD,SVNRevision.HEAD, true);
} catch (SVNException svne) {
//
}
}
六、典型功能实现的范例
环境创建
按快速入门中介绍的方法创建版本库。添加用户test,密码也为test。
启动版本库服务器。访问地址:svn://localhost/。
创建目录:E:\svntest\impDir(把此目录中的内容导入到版本库中)
\impProject
\juniper_config.txt
\cisco_config.txt
E:\svntest\wc (此目录是工作副本目录)
1、Import操作范例
package demo.wc;
import java.io.File;
importorg.tmatesoft.svn.core.SVNCommitInfo;
importorg.tmatesoft.svn.core.SVNDepth;
importorg.tmatesoft.svn.core.SVNException;
importorg.tmatesoft.svn.core.SVNURL;
importorg.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
importorg.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
importorg.tmatesoft.svn.core.wc.ISVNOptions;
importorg.tmatesoft.svn.core.wc.SVNClientManager;
importorg.tmatesoft.svn.core.wc.SVNWCUtil;
/*此类执行的操作是把本地目录下的内容上传到版本库中。*/
public class DoImport {
//声明SVN客户端管理类
privatestatic SVNClientManager ourClientManager;
publicstatic void main(String[] args) throws Exception {
//初始化支持svn://协议的库。必须先执行此操作。
SVNRepositoryFactoryImpl.setup();
//相关变量赋值
SVNURLrepositoryURL = null;
try{
repositoryURL= SVNURL.parseURIEncoded("svn://localhost/");
}catch (SVNException e) {
//
}
Stringname = "test";
Stringpassword = "test";
ISVNOptionsoptions = SVNWCUtil.createDefaultOptions(true);
//实例化客户端管理类
ourClientManager= SVNClientManager.newInstance(
(DefaultSVNOptions)options, name, password);
//要把此目录中的内容导入到版本库
FileimpDir = new File("e:/svntest/impDir");
//执行导入操作
SVNCommitInfocommitInfo=ourClientManager.getCommitClient().doImport(impDir, repositoryURL,
"importoperation!",null, false,false,SVNDepth.INFINITY);
System.out.println(commitInfo.toString());
}
}
2、checkout操作范例
package demo.wc;
importjava.io.File;
importorg.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
importorg.tmatesoft.svn.core.SVNURL;
importorg.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
importorg.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
importorg.tmatesoft.svn.core.wc.ISVNOptions;
importorg.tmatesoft.svn.core.wc.SVNClientManager;
importorg.tmatesoft.svn.core.wc.SVNRevision;
importorg.tmatesoft.svn.core.wc.SVNUpdateClient;
importorg.tmatesoft.svn.core.wc.SVNWCUtil;
/*此类执行的操作是把版本库中的内容check out到本地目录中*/
publicclass CheckOut {
//声明SVN客户端管理类
privatestatic SVNClientManagerourClientManager;
publicstatic void main(String[] args) throws Exception {
//初始化支持svn://协议的库。 必须先执行此操作。
SVNRepositoryFactoryImpl.setup();
//相关变量赋值
SVNURLrepositoryURL = null;
try {
repositoryURL= SVNURL.parseURIEncoded("svn://localhost/");
}catch (SVNException e) {
//
}
Stringname = "test";
Stringpassword = "test";
ISVNOptionsoptions = SVNWCUtil.createDefaultOptions(true);
//实例化客户端管理类
ourClientManager = SVNClientManager.newInstance(
(DefaultSVNOptions)options, name, password);
//要把版本库的内容check out到的目录
FilewcDir = new File("e:/svntest/wc");
//通过客户端管理类获得updateClient类的实例。
SVNUpdateClientupdateClient = ourClientManager.getUpdateClient();
/*
* sets externals not to be ignored during thecheckout
*/
updateClient.setIgnoreExternals(false);
//执行check out操作,返回工作副本的版本号。
long workingVersion= updateClient
.doCheckout(repositoryURL,wcDir, SVNRevision.HEAD, SVNRevision.HEAD, SVNDepth.INFINITY,false);
System.out.println("把版本:"+workingVersion+" check out 到目录:"+wcDir+"中。");
}
}
3、commit操作范例
注意:执行此操作要先执行checkout操作。因为本地需要有工作副本此范例才能运行。
package demo.wc;
import java.io.File;
import org.tmatesoft.svn.core.SVNDepth;
importorg.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
importorg.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
importorg.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
importorg.tmatesoft.svn.core.wc.ISVNOptions;
importorg.tmatesoft.svn.core.wc.SVNClientManager;
importorg.tmatesoft.svn.core.wc.SVNStatus;
importorg.tmatesoft.svn.core.wc.SVNStatusType;
importorg.tmatesoft.svn.core.wc.SVNWCUtil;
/*此类的操作是把工作副本的某个文件提交到版本库中*/
publicclass DoCommit {
// 声明SVN客户端管理类
privatestatic SVNClientManagerourClientManager;
publicstatic void main(String[] args) throws Exception {
//初始化支持svn://协议的库。 必须先执行此操作。
SVNRepositoryFactoryImpl.setup();
//相关变量赋值
SVNURL repositoryURL = null;
try {
repositoryURL = SVNURL.parseURIEncoded("svn://localhost/");
} catch (SVNException e) {
//
}
String name = "test";
String password = "test";
ISVNOptions options =SVNWCUtil.createDefaultOptions(true);
//实例化客户端管理类
ourClientManager = SVNClientManager.newInstance(
(DefaultSVNOptions)options, name, password);
//要提交的文件
File commitFile=new File("e:/svntest/wc/impProject/juniper_config.txt");
//获取此文件的状态(是文件做了修改还是新添加的文件?)
SVNStatus status=ourClientManager.getStatusClient().doStatus(commitFile,true);
//如果此文件是新增加的则先把此文件添加到版本库,然后提交。
if(status.getContentsStatus()==SVNStatusType.STATUS_UNVERSIONED){
//把此文件增加到版本库中
ourClientManager.getWCClient().doAdd(commitFile,false,false, false, SVNDepth.INFINITY,false,false);
//提交此文件
ourClientManager.getCommitClient().doCommit(
new File[] { commitFile },true, "",null,null,true,false, SVNDepth.INFINITY);
System.out.println("add");
}
//如果此文件不是新增加的,直接提交。
else{
// ourClientManager.getCommitClient().doCommit(
// new File[] {commitFile }, true, "", false, true);
ourClientManager.getCommitClient().doCommit(
new File[] { commitFile },true, "",null,null,true,false, SVNDepth.INFINITY);
System.out.println("commit");
}
System.out.println(status.getContentsStatus());
}
}
4、update操作范例
注意:执行此操作要先执行checkout操作。因为本地需要有工作副本此范例才能运行。
package demo.wc;
import java.io.File;
import org.tmatesoft.svn.core.SVNDepth;
importorg.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
importorg.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
importorg.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
importorg.tmatesoft.svn.core.wc.ISVNOptions;
importorg.tmatesoft.svn.core.wc.SVNClientManager;
importorg.tmatesoft.svn.core.wc.SVNRevision;
importorg.tmatesoft.svn.core.wc.SVNUpdateClient;
importorg.tmatesoft.svn.core.wc.SVNWCUtil;
/*此类用来把版本库中文件的某个版本更新到工作副本中*/
publicclass DoUpdate {
//声明SVN客户端管理类
privatestatic SVNClientManagerourClientManager;
publicstatic void main(String[] args) throws Exception {
//初始化支持svn://协议的库。 必须先执行此操作。
SVNRepositoryFactoryImpl.setup();
//相关变量赋值
SVNURL repositoryURL = null;
try {
repositoryURL = SVNURL.parseURIEncoded("svn://localhost");
} catch (SVNException e) {
//
}
String name = "test";
String password = "test";
ISVNOptions options =SVNWCUtil.createDefaultOptions(true);
//实例化客户端管理类
ourClientManager = SVNClientManager.newInstance(
(DefaultSVNOptions)options, name, password);
//要更新的文件
File updateFile=new File("e:/svntest/wc/impProject/juniper_config.txt");
//获得updateClient的实例
SVNUpdateClient updateClient =ourClientManager.getUpdateClient();
updateClient.setIgnoreExternals(false);
//执行更新操作
long versionNum=updateClient.doUpdate(updateFile,SVNRevision.HEAD, SVNDepth.INFINITY,false,false);
System.out.println("工作副本更新后的版本:"+versionNum);
}
}
5、版本差异比较操作范例
注意:执行此操作要先执行checkout操作。因为本地需要有工作副本此范例才能运行。
package demo.wc;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import org.tmatesoft.svn.core.SVNDepth;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNURL;
importorg.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.wc.ISVNOptions;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNDiffClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
/*此类用来比较某个文件两个版本的差异*/
publicclass DoDiff {
//声明SVN客户端管理类
privatestatic SVNClientManagerourClientManager;
publicstatic void main(String[] args) throws Exception {
//初始化支持svn://协议的库。 必须先执行此操作。
SVNRepositoryFactoryImpl.setup();
//相关变量赋值
SVNURL repositoryURL = null;//在此例中用不上。
try {
repositoryURL = SVNURL.parseURIEncoded("svn://localhost");
} catch (SVNException e) {
//
}
String name = "test";
String password = "test";
ISVNOptions options =SVNWCUtil.createDefaultOptions(true);
//实例化客户端管理类
ourClientManager = SVNClientManager.newInstance(
(DefaultSVNOptions)options, name, password);
//要比较的文件
File compFile = new File("e:/svntest/wc/impProject/juniper_config.txt");
//获得SVNDiffClient类的实例。
SVNDiffClient diff=ourClientManager.getDiffClient();
//保存比较结果的输出流
BufferedOutputStream result =new BufferedOutputStream(new FileOutputStream("E:/result.txt"));
//比较compFile文件的SVNRevision.WORKING版本和 SVNRevision.HEAD版本的差异,结果保存在E:/result.txt文件中。
//SVNRevision.WORKING版本指工作副本中当前内容的版本,SVNRevision.HEAD版本指的是版本库中最新的版本。
diff.doDiff(compFile,SVNRevision.HEAD, SVNRevision.WORKING, SVNRevision.HEAD, SVNDepth.INFINITY,true, result,null);
result.close();
System.out.println("比较的结果保存在E:/result.txt文件中!");
}
}
6、浏览版本库操作范例
此范例用了底层API.和高层 API的程序框架有所不同。
package demo.wc;
import java.util.Collection;
import java.util.Iterator;
import org.tmatesoft.svn.core.SVNDirEntry;
importorg.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNURL;
importorg.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
importorg.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
importorg.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
importorg.tmatesoft.svn.core.wc.SVNWCUtil;
/*
* 此类用来显示版本库的树状结构。
* 此类用底层API(LowLevel API)直接访问版本库。
* 此程序框架于1-5的示例(HighLevel API)稍有不同。
* */
publicclass DisplayRepositoryTree {
publicstatic void main(String[] args) {
// 初始化支持svn://协议的库。 必须先执行此操作。
SVNRepositoryFactoryImpl.setup();
/*
* 相关变量赋值
*/
String url = "svn://localhost";
String name = "test";
String password = "test";
//定义svn版本库的URL。
SVNURL repositoryURL = null;
//定义版本库。
SVNRepository repository = null;
/*
* 实例化版本库类
* */
try {
//获取SVN的URL。
repositoryURL=SVNURL.parseURIEncoded(url);
//根据URL实例化SVN版本库。
repository = SVNRepositoryFactory.create(repositoryURL);
} catch (SVNException svne) {
/*
* 打印版本库实例创建失败的异常。
*/
System.err
.println("创建版本库实例时失败,版本库的URL是 '"
+ url + "': " + svne.getMessage());
System.exit(1);
}
/*
* 对版本库设置认证信息。
*/
ISVNAuthenticationManagerauthManager = SVNWCUtil.createDefaultAuthenticationManager(name,password);
repository.setAuthenticationManager(authManager);
/*
* 上面的代码基本上是固定的操作。
* 下面的部门根据任务不同,执行不同的操作。
* */
try {
//打印版本库的根
System.out.println("Repository Root: " + repository.getRepositoryRoot(true));
//打印出版本库的UUID
System.out.println("Repository UUID: " + repository.getRepositoryUUID(true));
System.out.println("");
//打印版本库的目录树结构
listEntries(repository,"");
} catch (SVNException svne) {
System.err.println("打印版本树时发生错误:"
+svne.getMessage());
System.exit(1);
}
/*
* 获得版本库的最新版本树
*/
long latestRevision = -1;
try {
latestRevision = repository.getLatestRevision();
} catch (SVNException svne) {
System.err
.println("获取最新版本号时出错:"
+svne.getMessage());
System.exit(1);
}
System.out.println("");
System.out.println("---------------------------------------------");
System.out.println("版本库的最新版本是:" + latestRevision);
System.exit(0);
}
/*
* 此函数递归的获取版本库中某一目录下的所有条目。
*/
publicstatic void listEntries(SVNRepositoryrepository, String path)
throws SVNException {
//获取版本库的path目录下的所有条目。参数-1表示是最新版本。
Collection entries =repository.getDir(path, -1, null,
(Collection) null);
Iterator iterator =entries.iterator();
while (iterator.hasNext()) {
SVNDirEntry entry =(SVNDirEntry) iterator.next();
System.out.println("/" + (path.equals("") ?"" : path + "/")
+entry.getName() + " (author: '" + entry.getAuthor()
+ "'; revision: " + entry.getRevision() + "; date: " + entry.getDate() + ")");
/*
* 检查此条目是否为目录,如果为目录递归执行
*/
if (entry.getKind() ==SVNNodeKind.DIR) {
listEntries(repository,(path.equals("")) ? entry.getName()
: path + "/" + entry.getName());
}
}
}
}
7、显示文件内容操作范例
此范例用了底层API.和高层 API的程序框架稍有不同。
package demo.wc;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Iterator;
importorg.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
importorg.tmatesoft.svn.core.SVNProperties;
import org.tmatesoft.svn.core.SVNProperty;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
importorg.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
importorg.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
importorg.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.io.SVNRepository;
importorg.tmatesoft.svn.core.io.SVNRepositoryFactory;
importorg.tmatesoft.svn.core.wc.SVNWCUtil;
/*此类用来显示版本库中文件的内容。
* 此类用底层API(LowLevel API)直接访问版本库。
* 此程序框架与1-5的示例稍有不同。
* */
publicclass DisplayFile {
publicstatic void main(String[] args) {
//初始化库。 必须先执行此操作。具体操作封装在setupLibrary方法中。
setupLibrary();
/*
* 相关变量赋值
*/
String url = "svn://localhost";
String name = "test";
String password = "test";
String filePath = "impProject/juniper_config.txt";
//定义svn版本库的URL。
SVNURL repositoryURL = null;
//定义版本库。
SVNRepository repository = null;
try {
//获取SVN的URL。
repositoryURL=SVNURL.parseURIEncoded(url);
//根据URL实例化SVN版本库。
repository =SVNRepositoryFactory.create(repositoryURL);
} catch (SVNException svne) {
/*
* 打印版本库实例创建失败的异常。
*/
System.err
.println("创建版本库实例时失败,版本库的URL是 '"
+ url + "': " + svne.getMessage());
System.exit(1);
}
/*
* 对版本库设置认证信息。
*/
ISVNAuthenticationManagerauthManager = SVNWCUtil.createDefaultAuthenticationManager(name,password);
repository.setAuthenticationManager(authManager);
//此变量用来存放要查看的文件的属性名/属性值列表。
SVNProperties fileProperties= new SVNProperties();
//此输出流用来存放要查看的文件的内容。
ByteArrayOutputStream baos =new ByteArrayOutputStream();
try {
//获得版本库中文件的类型状态(是否存在、是目录还是文件),参数-1表示是版本库中的最新版本。
SVNNodeKind nodeKind =repository.checkPath(filePath, -1);
if (nodeKind == SVNNodeKind.NONE) {
System.err.println("要查看的文件在 '" + url +"'中不存在.");
System.exit(1);
} elseif (nodeKind == SVNNodeKind.DIR) {
System.err.println("要查看对应版本的条目在'" + url
+ "'中是一个目录.");
System.exit(1);
}
//获取要查看文件的内容和属性,结果保存在baos和fileProperties变量中。
repository.getFile(filePath, -1, fileProperties, baos);
} catch (SVNException svne) {
System.err.println("在获取文件内容和属性时发生错误:" + svne.getMessage());
System.exit(1);
}
//获取文件的mime-type
String mimeType =fileProperties.getStringValue(SVNProperty.MIME_TYPE);
//判断此文件是否是文本文件
boolean isTextType = SVNProperty.isTextMimeType(mimeType);
/*
* 显示文件的所有属性
*/
Iterator iterator =fileProperties.nameSet().iterator();
while (iterator.hasNext()) {
String propertyName =(String) iterator.next();
String propertyValue =fileProperties.getStringValue(propertyName);
System.out.println("文件的属性: " + propertyName +"="
+propertyValue);
}
/*
* 如果文件是文本类型,则把文件的内容显示到控制台。
*/
if (isTextType) {
System.out.println("File contents:");
System.out.println();
try {
baos.writeTo(System.out);
} catch (IOException ioe) {
ioe.printStackTrace();
}
} else {
System.out
.println("因为文件不是文本文件,无法显示!");
}
/*
* 获得版本库的最新版本号。
*/
long latestRevision = -1;
try {
latestRevision =repository.getLatestRevision();
} catch (SVNException svne) {
System.err.println("获取最新版本号时出错:" + svne.getMessage());
System.exit(1);
}
System.out.println("");
System.out.println("---------------------------------------------");
System.out.println("版本库的最新版本号:" + latestRevision);
System.exit(0);
}
/*
* 初始化库
*/
privatestatic void setupLibrary() {
/*
* For using over http://and https://
*/
DAVRepositoryFactory.setup();
/*
* For using over svn:// andsvn+xxx://
*/
SVNRepositoryFactoryImpl.setup();
/*
* For using over file:///
*/
FSRepositoryFactory.setup();
}
}
七、参考资源
http://www.svnkit.com/documentation.html:里面有SVNKit的介绍及详细的示例代码。
SVNKit工具包中的javadoc文档:里面有详细的类及类方法的介绍。
SVNKit下载地址:http://www.svnkit.com
自己写了一个小例子(文件检出、文件比对)功能,包含jar包,已上传,请自行查找
jar包、例子下载地址:http://download.csdn.net/download/u013488838/9863932