1

首先,我不确定这是否可能,但是我需要知道如何做到这一点,如果没有,为什么不呢?

我想创建一个 C# 应用程序,该应用程序在 subversion 存储库的提交过程中的适当时间运行(我相信是预提交),然后将添加另一个要提交的文件。

例如,我对 Program.cs 和 Main.cs 进行了更改,但没有更改AssemblyInfo.cs。我希望能够强制更改 AssemblyInfo.cs 或任何文件。

我使用 SharpSVN 编写了一个控制台应用程序,该应用程序在提交后触发,然后替换了一个文件,但这导致修订号增加。显然这并不理想。

然后我在 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# 控制台应用程序中执行此操作,以便我还可以告诉我的存储库服务器执行其他任务,例如在数据库脚本中运行等。

4

1 回答 1

9

您不得在挂钩脚本期间修改事务。您可以使用消息拒绝提交(stderr 将被发送到客户端),或者在提交后的单独提交中进行。

[编辑] 我想澄清为什么修改交易是一个坏主意(svn 技术):

客户对此一无所知。

除了“OK”、“FAILED”和 stderr 输出之外,在提交期间没有从服务器到客户端的反向通道。

当客户端提交其更改并报告提交成功时,它会将其本地文件和文件夹状态标记为与存储库版本同步 [xyz]。当您稍后更改某些内容时,例如,在本地添加文件时,它想要提交这些更改,但是...好吧,您可以尝试知道会发生什么,我预计会出现“校验和错误”或“文件已添加” . 根据更改的类型,您可能没有比删除文件夹并重新检查损坏的部分更好的机会来获得工作的 WC。

那是技术部分。现在开发人员方面:首先,正确地自动修复更改似乎很聪明,但它会失败,因为一个简单的事实是,如果源代码是可预计算的,我们就不必让它由开发人员编写。您希望您的开发人员做正确的事情。

这通过教育最有效:他们必须知道什么是正确的。让他们了解某事的好方法是,除了任何类型的良好旧培训之外,还给他们反馈。

来自 svn 服务器的错误消息、损坏的构建或单元测试后的自动邮件、来自静态源代码分析工具的结果等,也可以作为一个很好的教育工具。

我建议使用持续集成,并在那里验证源树。这样做的好处是开发人员在漫长的工作日后不会被阻止提交他的更改,但您仍然知道源树的状态。

而且,我现在只是猜测您要尝试实现的目标:服务器端源代码树应始终是“功能性的”。那么问题是,即使有了自动文件修复、预提交单元测试、样式检查等等,你最终仍然必须通过旧式系统测试来检查程序是否真正工作。所以基本上,你并没有真正获得任何东西。

技术可以支持流程,经过深思熟虑的工具可以很好地支持它,以至于遵循流程实际上可以帮助开发人员节省时间并简化他们的工作流程。但技术通常无法取代流程,也无法取代人类智能(至少目前如此)。[/编辑]

于 2009-08-28T16:07:17.347 回答