我目前正在尝试获取所有SVN修订版,然后一个接一个地检查它们并对它们做些什么。
使用
svn checkout http://hamcrest.googlecode.com/svn/trunk/ hamcrest-read-only
(使用SVN 1.8.8)我得到了代码(我只是以使用hamcrest为例)。
获得后,我正在尝试执行以下操作:
FSRepositoryFactory.setup();
SVNURL localRepo = FSRepositoryFactory.createLocalRepository(f, true,
true);
System.out.println("Repo: " + localRepo);
SVNRepository repo = FSRepositoryFactory.create(localRepo);
log.info("Revisions: " + repo.getLatestRevision() + " Path: "
+ f.getAbsolutePath());
List<SVNLogEntry> col = (List<SVNLogEntry>) repo.log(
new String[] { "" }, null, 0, repo.getLatestRevision(), true,
true);
for (Object o : col) {
System.out.println("O: " + o + " " + o.getClass());
}
System.out.println("Col: " + col.getClass());
遗憾的是,这会创建一个空的存储库,并删除其中的所有内容。这对应于FSRepositoryFactory.create的文档。
所以我搜索了一种以另一种方式打开现有存储库的方法,并找到了SVNURL localRepo = SVNURL.fromFile(f);
。不幸的是,这会产生错误:
Exception in thread "main" org.tmatesoft.svn.core.SVNException: svn: E180001: Unable to open an ra_local session to URL
svn: E180001: Unable to open repository 'file:///home/reichelt/workspace/hamcrest/hamcrest-read-only'
svn: E180001: Unable to open repository 'file:///home/reichelt/workspace/hamcrest/hamcrest-read-only'
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:64)
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.error(SVNErrorManager.java:51)
at org.tmatesoft.svn.core.internal.io.fs.FSRepository.openRepository(FSRepository.java:796)
at org.tmatesoft.svn.core.internal.io.fs.FSRepository.getLatestRevision(FSRepository.java:121)
at de.performanzanalysator.vcs.SVNUtils.getVersions(SVNUtils.java:70)
at de.performanzanalysator.vcs.SVNUtils.main(SVNUtils.java:90)
有谁知道天气有办法用SVNKit打开已经下载的现有存储库? SVNWCClient
似乎是正确的,但我找不到任何方法来使用SVNWCClient
打开存储库。
我正在使用SVNKit 1.8.5。
答案 0 :(得分:1)
问题中提到的异常发生是因为SVNRepository
类期望用于存储库,但它用于工作副本。
SVN的服务器端部分称为存储库,客户端部分称为工作副本。 svn checkout
命令用于从(通常是远程的)存储库创建(通常是本地)工作副本。工作副本仅包含一个修订版,因此某些操作(例如,日志)将需要访问远程存储库。
SvnOperationFactory
类提供了一个API来执行所有&#34; generic&#34; SVN对工作副本和存储库执行任务。它可以用于获取完整的更改日志,但请记住,即使针对本地工作副本启动了日志操作,它也会联系存储库。
File workingCopyLocation = new File( ... );
SvnOperationFactory operationFactory = new SvnOperationFactory();
SvnLog logOperation = operationFactory.createLog();
logOperation.setSingleTarget(
SvnTarget.fromFile( workingCopyLocation )
);
logOperation.setRevisionRanges( Collections.singleton(
SvnRevisionRange.create(
SVNRevision.create( 1 ),
SVNRevision.HEAD
)
) );
Collection<SVNLogEntry> logEntries = logOperation.run( null );
System.out.println( "logEntries = " + logEntries );
您可以使用相同的代码直接从存储库获取更改日志,而无需通过将setSingleTarget
初始化更改为指向远程存储库来检出工作副本:
String repoLocation = "http://hamcrest.googlecode.com/svn/trunk";
logOperation.setSingleTarget(
SvnTarget.fromURL(
SVNURL.parseURIEncoded( repoLocation )
)
);
从SVNKit 1.7开始,SvnOperationFactory
是使用SVNKit的首选方式。 SVNKit仍然包含SVNClientManager
,它提供了类似的功能,但它被认为是过时的。
SVNRepository
类及其子类旨在与存储库交互,如果您正在编写用于创建,配置或提供SVN存储库的软件,这将非常有用。例如,您可以使用该API直接从存储库获取更改日志,但除非您正在编写执行其他存储库相关任务的服务器端软件,否则应使用SvnOperationFactory
方法。
String repoLocation = "http://hamcrest.googlecode.com/svn/trunk";
// DAV allows access via http and https protocols
// use FSRepositoryFactory to access local repositories
// use SVNRepositoryFactory to access remote repositories via svn protocol
DAVRepositoryFactory.setup();
SVNRepository repository = DAVRepositoryFactory.create(
SVNURL.parseURIEncoded( repoLocation )
);
repository.log(
new String[]{ },
0, -1,
false, false,
new ISVNLogEntryHandler()
{
@Override
public void handleLogEntry( SVNLogEntry logEntry )
{
System.out.println( "logEntry = " + logEntry );
}
}
);