在一些自动化流程里,需要对SVN进行一些操作,再看了一些关于SharpSvn的demo和文章之后,发现基本都是对单文件进行的操作,对于多文件的一次提交基本没有,除此之外,还有对文件的删除操作,更是寥寥无几,
因此记录一下SharpSvn对于多文件的操作(一次提交中包含多个问价的增删改)
SharpSvn
下载地址:https://github.com/AmpScm/SharpSvn
也可以直接从nuget安装
官方文档:https://sharpsvn.open.collab.net/docs/walkthrough.htm
SVN 操作(SharpSvn)
Update 更新文件
调用update即可
using (SvnClient client = new SvnClient())
{
SvnStatusArgs sa = new SvnStatusArgs();
sa.Depth = SvnDepth.Children; // Adjust this to check direct files,or (recursive) directories etc
Collection<SvnStatusEventArgs> statuses;
bool isok = false;
try
{
isok = client.Update(selectPath);
}
catch (Exception)
{
isok = false;
}
if (!isok)
{
MessageBox.Show("SVN路径错误,请重新选择");
}
else
{
svnPath = selectPath;
}
return isok;
}
Commit 提交文件
提交文件比较复杂一点,需要判断文件的状态(主要三种状态,修改,新增,删除)
新增文件需要使用Add,然后再进行commit
删除状态的文件,需要先Delete,然后进行commit
修改状态的文件可以直接 commit,不需要进行操作。
那么如何获取文件状态呢?client.GetStatus(svnPath, out list);
获取修改列表,然后对文件状态进行判断,
NotVersioned 状态是新文件,add,
Missing 状态是删除文件,Delete,
Modified 状态是修改,不需要操作
最后进行一次Commit即可
如果没有新文件没有add,commit会报错
如果对modified 的文件进行delete,delete会报错
总结
删除的文件必须要delete再提交,
增加和修改的文件都可以进行Add
因此使用GetStatus 获取所有文件更改状态,然后分别操作,最后commit
完整提交代码参考:
public static bool Commit()
{
using (SvnClient client = new SvnClient())
{
SvnCommitResult commitResult = null;
SvnCommitArgs svnCommitArgs = new SvnCommitArgs();
svnCommitArgs.Depth = SvnDepth.Empty;
svnCommitArgs.LogMessage = "增删改的综合提交测试";
var changeList = ChangeFilesOperate();
commitOK = client.Commit(changeList, svnCommitArgs);
if (!commitOK)
{
MessageBox.Show("SVN提交失败,请手动SVN提交");
}
return commitOK;
}
}
/// <summary>
/// 对所有增加删除修改的文件进行 对应的操作
/// </summary>
/// <returns></returns>
public static List<string> ChangeFilesOperate()
{
List<string> ChangeFilePath = new List<string>();
using (SvnClient client = new SvnClient())
{
Collection<SvnStatusEventArgs> list = new Collection<SvnStatusEventArgs>();
client.GetStatus(svnPath, out list);
foreach (SvnStatusEventArgs eventArgs in list)
{
var state = eventArgs.LocalContentStatus;
//从eventArgs中获取每个变更文件的相关信息,针对不同状态操作
if (state == SvnStatus.Missing)
{
client.Delete(eventArgs.FullPath);
}
if (state == SvnStatus.NotVersioned)
{
client.Add(eventArgs.FullPath);
}
//修改状态直接提交即可
ChangeFilePath.Add(eventArgs.FullPath);
}
}
return ChangeFilePath;
}
注意事项
(重要的事情说三遍):
删除SVN文件,需要先Delete,然后进行commit
删除SVN文件,需要先Delete,然后进行commit
删除SVN文件,需要先Delete,然后进行commit
如果不进行Delete,Commit不会提交删除文件的操作