为同一个项目使用两个不同的 SVN 存储库

Using two different SVN repositories for the same project

作为一名顾问,我通常可以访问客户的 svn 存储库,以便签出、处理并最终提交项目。

最佳(是客户请求)是在客户的 svn 上只提交稳定版本并避免中间(即不可构建)提交,但我也想跟踪开发过程并享受版本控制的好处系统...

那么做这样的事情会很棒:

我可以使用一些脚本(自动执行结帐、删除 .svn 内容、提交等)完成此任务,但这离顺利的过程还很远。

我试图寻找解决方案,但我还没有找到任何有用的东西。

有谁知道一种简单而高效的方法吗?

提前致谢。

很抱歉,我的回答暗示使用另一个 VCS,但是使用 git-svn 很容易做到这一点。在开发期间提交 git,将您的提交压缩为一次“干净”提交,然后 dcommit 将其发送到 SVN 服务器。

不过,如果您不是 git 用户,这对于您的目的来说可能过于复杂。

最好和最简单的解决方案是使用您身边的另一个 SCM + 桥接到 SVN(Mercurial + HGSubversion,不是 Git

但即使使用纯 SVN,您至少有两个可行的解决方案:供应商分支和共享 UUID

供应商分支机构

  • 阅读Vendor Branches topic from SVN Book (mostly Vendor Branches from Foreign Repositories part) and related Externals Definitions
  • 根据"Vendor Branches" 建议
  • 构建您的 存储库,并链接到客户的存储库
  • 在您的存储库的私有部分执行您的日常工作
  • 将完善和完成的工作合并到 Vendor Branch 并将结果(一个大合并集)提交到客户的存储库(您必须在客户端拥有 RW 权限)
  • (不时) 将来自客户回购的其他人提交合并到您回购中的私人分支

共享 UUID

您可以通过干净、合法的方式 (svn help relocate) 更改(对于现有 WC)URL 相关 SVN 存储库,它主要用于基础架构管理,但对您也有用。

用于重定位的 FROM 和 TO 存储库假定为相同的存储库,通过检查存储库的 UUID 来验证身份,因此:对于两个不同的存储库(客户和您),您必须提供相同的 UUID。

它可以通过加载|转储循环轻松实现(svnadmin dump 客户端的回购/或只需要它的节点/,svnadmin load ... --force-uuid 到您的空存储库)之后您可以执行任何工作在您的存储库中。 "Ready to publish" 如果您满足以下条件,作品将出现在客户的仓库中:

  • 将您的 WC 重新定位到客户的存储库
  • 更新(半自动 - 你无法避免它,无冲突的合并将出现在你的 WC 中,无需你的干预),客户端遗漏了更改
  • 在 WC 中提交您的(可能是长期的)更改(它将是 "Modified",与客户的回购相反)作为一个巨大的提交
  • 将 WC 重新定位回您的存储库

PS:"Vendor Branches" 是我的 POV 更安全的方法,代价是 Subversion 的合并可能出现问题(仍然 没有 DVCS 世界那么漂亮)