我正在尝试使用SharpSVN自动执行Subversion签入,但我遇到了SvnClient.Add()方法的问题,我相信它可能是一个错误。本质上,.Add()没有将路径视为工作副本,但是,SvnClient.GetUriFromWorkingCopy()看到它就好了。似乎.Add()看起来比它应该高1目录,我似乎无法使用.Add()。或.. ..
我的代码证明如下。通过将路径指向工作副本的顶级并运行来进行复制。任何帮助表示赞赏!
static void Main(string[] args)
{
string PathToTest = @"C:\temp\sqlcompare";
SvnClient client = new SvnClient();
SvnAddArgs saa = new SvnAddArgs();
saa.Force = true;
saa.Depth = SvnDepth.Infinity;
Console.WriteLine(PathToTest);
Console.WriteLine(client.GetUriFromWorkingCopy(PathToTest));
try
{
client.Add(PathToTest, saa);
Console.WriteLine(@"Success");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
产生的输出:
C:\temp\sqlcompare
https://thisismycompanyname.svn.cvsdude.com/project/soltuionname/trunk/Database/
'C:\temp' is not a working copy
添加尾部斜杠也不起作用:
C:\temp\sqlcompare\
https://thisismycompanyname.svn.cvsdude.com/project/soltuionname/trunk/Database/
'C:\temp' is not a working copy
答案 0 :(得分:1)
在本地路径成为工作副本之前,您需要.Checkout()调用(或与其他客户端进行一些结帐)。您只能将目录添加到现有工作副本。
SharpSvn中此规则的唯一一个小例外是SvnClient.Import(),它实际上是'svn import'(SvnClient.RemoteImport),后跟'svn checkout --force'。
答案 1 :(得分:0)
关于这一点,文档还不清楚,但是如果你看一下SharpSvn.SvnDepth
枚举,你可以做一些有根据的猜测。目前无法调用SvnClient.Add(targetPath)
并尝试添加targetPath的所有子项(targetPath/*
)。 应该有一个SvnDepth。
我的另一个小小的烦恼是Add似乎不适用工作副本的忽略列表。
所以为了做你想做的事,我建议像:
private void RecursiveAdd(SvnClient client, string targetPath, List<string> ignoreList)
{
foreach (var fileEntry in Directory.EnumerateFileSystemEntries(targetPath))
{
if (ignoreList.Any(fileEntry.Contains))
continue;
Runtime.ActiveLog.Info(fileEntry);
client.Add(fileEntry, new SvnAddArgs()
{
Depth = SvnDepth.Empty,
Force = true
});
if (Directory.Exists(fileEntry))
RecursiveAdd(client, fileEntry, ignoreList);
}
}
public AddPath(string targetPath)
{
using (var client = new SvnClient())
{
var ignoreList = GetIgnore(targetPath);
RecursiveAdd(client, targetPath, ignoreList);
}
}
它仍然需要错误处理和一般代码改进(例如在忽略列表周围),但它应该得到重点。
答案 2 :(得分:0)
这对我有用。它应该将本地签出的文件夹与SVN中的文件夹同步:
string _localCheckoutPath = @"C:\temp\sqlcompare";
SvnClient client = new SvnClient();
Collection<SvnStatusEventArgs> changedFiles = new Collection<SvnStatusEventArgs>();
client.GetStatus(_localCheckoutPath, out changedFiles);
//delete files from subversion that are not in filesystem
//add files to suversion , that are new in filesystem
foreach (SvnStatusEventArgs changedFile in changedFiles)
{
if (changedFile.LocalContentStatus == SvnStatus.Missing)
{
client.Delete(changedFile.Path);
}
if (changedFile.LocalContentStatus == SvnStatus.NotVersioned)
{
client.Add(changedFile.Path);
}
}
SvnCommitArgs ca = new SvnCommitArgs();
ca.LogMessage = "Some message...";
client.Commit(_localCheckoutPath, ca);