代码之家  ›  专栏  ›  技术社区  ›  rmeador

在两个可写的SVN Repo之间镜像子文件夹

  •  2
  • rmeador  · 技术社区  · 16 年前

    我有一种情况,我正试图处理涉及我公司的SVN服务器。我们将所有重要的代码保存在一个锁定的服务器中(我们称之为“dev”服务器)。有些文件需要由企业网络之外的用户编辑,因此我们有另一个SVN服务器(“全局”服务器),它可以在防火墙之外访问,并且包含包含外部所需文件的目录副本。如果重要的话,全局服务器的文件夹结构是dev服务器的一个子集(即,它只是一些选择的文件/目录,但所有文件/目录都具有相同的相对路径等)。我已经包括了一个简短的解释 为什么? 如果你想读的话,我们会在文章结尾处尝试这样做,但是相信我,这必须在两个独立的服务器上完成。

    乍一看, svnsync 似乎是这个工作的理想选择,但它有一个不幸的问题,即要求它是修改目标存储库的唯一工具。显然,这是行不通的,因为我们的开发库被大量使用。

    在我看来,有两种解决方案,它们都不是一个好的解决方案。我希望有人能帮助我调整其中的一个,或者更好地提供一个替代方案。

    1. 我的第一个想法是在dev服务器中使用externals,但这有一些问题。最值得注意的是,外部机构将遵循头部修订(我们不希望将其设置为特定修订,因为这样会破坏要点),因此,如果我们调出较旧版本的dev repo,外部机构的定义仍将指向全球repo的头部,而不是指全球repo在旧修订时代的样子。--因此,我们无法通过签出旧版本来重新创建旧版本。
    2. 另一种解决方案是让cron作业定期从全局repo导出最新版本,并将这些更改的文件覆盖到dev repo的工作副本上,然后提交更改。可能这个覆盖和提交步骤将使用 svn_load_dirs.pl SVN附带的脚本。理想情况下,这将作为全局repo上的提交后挂钩完成,但由于防火墙原因,全局服务器无法访问dev服务器,因此必须由防火墙内的计算机(可能是dev服务器本身)执行。这种方法的缺点是:只要cron作业上的间隔时间长,dev服务器就可能过时,如果有人意外地向dev服务器提交了更改,那么他们的更改将受到限制。(顺便说一句,如果有人能想出双向同步的方法,那就太棒了!)

    我目前倾向于选择2,因为它似乎能让我尽可能接近我需要的东西,但这仍然是一个相当糟糕的选择。这也是我们目前正在做的工作,用人代替人脉。我为这封长信道歉。非常感谢您提供的帮助。

    解释原因: 我们需要这些共享文件存在于dev-server目录层次结构中,因为它们是我们软件的必需部分,所以构建、测试等必须具有它们。我不能通过防火墙公开dev服务器——我试图说服那些已经失败的力量。我已经向决策者清楚地表明,拥有两个独立的服务器并不是SVN的用途,而且很可能会出现问题。为了帮助缓解我们已经预见到的一些问题,只有全局服务器是可写的。dev服务器的文件副本在概念上是只读的(仅当更改从全局服务器同步时才修改),但我认为我实际上不能用svn访问控制来实施只读策略,因为该目录结构中的某些文件在全局repo中不存在,因此需要在de中编辑。所以我不能盲目地把它变成只读的。以每个文件为基础设置只读似乎是不可维护的,因为有数百个文件,它们经常被添加和删除。

    2 回复  |  直到 11 年前
        1
  •  1
  •   Stefan    16 年前

    您可以尝试设置一个直写代理,以便将公共存储库中的所有写入操作自动转发到专用服务器。

    我从来没有这样做过,但是 here 是关于这个主题的一些文档。

        2
  •  1
  •   thekbb    11 年前

    与其在源代码管理上变得复杂,不如将两个repo拆分(从dev中删除全局代码),然后让dev的构建使用全局的构建。因为您的内部人员将能够承诺两者,并且在两者中使用相同的代码永远是困难的。

    您没有提到涉及的语言工具…所以很难知道这是如何适应的。考虑在全局发布工件的基础上构建,然后构建全局解决该依赖性。

    有一件事你在备选方案2中没有提到,你将失去审计跟踪,因为提交给Global的用户不会是覆盖并提交给dev的用户。