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

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

有帮助吗?

解决方案

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

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

客户对此一无所知。

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

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top