djd*_*d87 1 svn pre-commit sharpsvn
首先,我不确定这是否可行,但我需要知道如何做到这一点,如果不是为什么不呢?
我想创建一个C#应用程序,它在subversion存储库的提交过程中运行(我相信预提交),然后添加另一个要提交的文件.
例如,我对Program.cs和Main.cs进行了更改,但没有对 AssemblyInfo.cs 进行更改.我希望能够强制更改AssemblyInfo.cs或任何文件.
我使用SharpSVN编写了一个控制台应用程序,它在post-commit上触发,然后替换了一个文件,但这导致了修订版本号的增加.显然这并不理想.
然后我发现SharpSVN中的SvnLookClient在预提交时运行并且已经开始写一些东西,但是当我意识到CopyFromPath并不意味着我的期望时,我遇到了死胡同:
using (SvnLookClient client = new SvnLookClient())
{
SvnLookOrigin o = new SvnLookOrigin(@"\\server\repository");
SvnChangedArgs changedArgs = new SvnChangedArgs();
Collection<SvnChangedEventArgs> changeList;
client.GetChanged(o, changedArgs, out changeList);
}
Run Code Online (Sandbox Code Playgroud)
或者,我会决定在C#之外执行此操作,但理想情况下我想在C#控制台应用程序中执行此操作,以便我也可以告诉我的存储库服务器执行其他任务,例如在数据库脚本中运行等.
您不能在钩子脚本期间修改事务.您可以使用消息拒绝提交(stderr将发送到客户端),也可以在提交后的单独提交中执行.
[edit]我想澄清为什么修改交易是一个坏主意(从技术上讲):
客户对此一无所知.
除了"OK","FAILED"和stderr输出之外,在提交期间没有从服务器到客户端的反向通道.
当客户端提交更改并且报告提交成功时,它会将其本地文件和文件夹状态标记为与存储库版本[xyz]同步.例如,当您稍后更改某些内容时,在本地添加该文件,它想要提交这些更改,但随后......嗯,您可以尝试知道会发生什么,我希望"校验和错误"或"文件已添加" .根据更改的类型,您可能没有更好的机会获得工作的WC,而不是删除文件夹并对损坏的部分进行新的检查.
那是技术部分.现在是开发人员方面:首先,自动修正更改似乎很聪明,但它会失败,因为如果源是可预先计算的,我们就不必让开发人员写它.您希望您的开发人员做正确的事情.
这最适合通过教育:他们必须知道什么是正确的.让他们了解某些事情的好方法是,除了良好的旧培训之外,给予他们反馈.
来自svn服务器的错误消息,破坏的构建或单元测试之后的自动邮件,静态源代码分析工具等的结果,也可以作为良好的教育工具.
我建议使用继续集成,并在那里验证源树.这样做的好处是,在长时间工作之后,开发人员不会被阻止提交更改,但您仍然知道源树的状态.
而且,我现在只是猜测你想要实现的目标:服务器端源树应该始终是"功能性的".然后问题是,即使使用自动文件修复,预提交单元测试,样式检查等等,您最终仍需要通过旧式系统测试来检查程序是否真正有效.所以基本上,你没有真正获得任何东西.
技术可以支持流程,经过深思熟虑的工具可以很好地支持流程,以便后续流程可以帮助开发人员节省时间并简化工作流程.但技术通常不能取代流程,它不能取代人类的智慧(至少目前为止).[/编辑]