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