目录
概述
在.NET开发环境中,与Subversion(SVN)版本控制系统交互主要有两种方式:一种是直接使用SharpSvn库提供的API,另一种是通过调用TortoiseSVN客户端程序(TortoiseProc.exe)。本文将全面介绍这两种方法,包括安装配置、基本操作、高级功能以及异常处理等内容。
第一部分:SharpSvn库介绍与基本使用
SharpSvn库概述
SharpSvn是一个为.NET框架设计的开源库,它允许开发者通过C#代码直接与SVN服务器进行交互。该库提供了丰富的API,能够执行从基本的版本控制任务(如检出、提交、更新和添加文件)到更复杂的操作(如分支和合并)。
安装和配置SharpSvn
通过NuGet安装
最简单的方式是通过NuGet包管理器安装SharpSvn:
// 在程序包管理器控制台中输入
NuGet\Install-Package SharpSvn.1.7-x86 -Version 1.7006.2206
安装完成后,项目中会自动添加对SharpSvn.dll的引用。
手动安装
- 从官方项目网站或源代码管理系统下载SharpSvn库的压缩文件
- 解压文件,通常会得到一个包含SharpSvn.dll的文件夹
- 将SharpSvn.dll文件复制到.NET程序目录中(通常是项目的BIN目录或与应用程序可执行文件相同的目录)
- 在Visual Studio中,右击项目中的"引用"部分,选择"添加引用",浏览到SharpSvn.dll的位置并添加
运行时配置
在app.config的configuration-startup节点下增加属性:
<startup useLegacyV2RuntimeActivationPolicy="true">
基本SVN操作
检出(Checkout)
using SharpSvn;
SvnUriTarget target = new SvnUriTarget("http://svn.example.com/repos/project", "");
using (SvnClient client = new SvnClient())
{
client.Checkout(target, @"C:\temp\project");
}
判断工作副本状态
// 方法1
public bool IsWorkingCopy(string path)
{
var uri = client.GetUriFromWorkingCopy(path);
return uri != null;
}
// 方法2
if (!SvnTools.IsManagedPath(localPath))
{
// 目录不受SVN管理
}
if (!IsWorkingCopy(localPath))
{
// 检出文件
client.CheckOut(new SvnUriTarget(onlineSVN), localPath);
}
更新(Update)
using (SvnClient client = new SvnClient())
{
client.Update(@"C:\temp\project");
}
提交(Commit)
using (SvnClient client = new SvnClient())
{
SvnCommitArgs commitArgs = new SvnCommitArgs();
commitArgs.Depth = SvnDepth.Empty;
commitArgs.LogMessage = "My Test Commit";
SvnCommitResult commitResult = null;
client.Commit(@"d:\\svn\temp\test.txt", commitArgs, out commitResult);
}
导出(Export)
SvnUriTarget remote = new SvnUriTarget(path); // svn路径
using (SvnClient client = new SvnClient())
{
if (!client.Export(remote, tarPath)) // 导出到指定路径(不带.svn目录)
{
return;
}
}
第二部分:SharpSvn高级功能
认证处理
SharpSvn提供了灵活的认证机制:
using (SvnClient client = new SvnClient())
{
client.Authentication.Clear(); // 清除原有的账户信息
// 用户名密码认证
client.Authentication.UserNamePasswordHandlers +=
new EventHandler<SharpSvn.Security.SvnUserNamePasswordEventArgs>(
delegate (Object s, SharpSvn.Security.SvnUserNamePasswordEventArgs ee)
{
ee.UserName = "abc";
ee.Password = "defg";
});
// SSL服务器信任处理
client.Authentication.SslServerTrustHandlers +=
new Eve