【问题标题】:How to replace a directory in a SVN repository without breaking anything如何在不破坏任何内容的情况下替换 SVN 存储库中的目录
【发布时间】:2011-04-14 14:20:45
【问题描述】:

我需要在生产服务器上替换我的 SVN 存储库中的一个目录,但我不确定在不破坏任何东西的情况下执行此操作的正确方法。被替换的目录是一个已经完全重构的第三方模块版本,所以为了干净地升级我需要删除旧的目录/文件并替换为新的目录和文件。当我这样做(使用 svn delete)时,工作副本被阻塞或处于阻止我提交或添加新的、未版本控制的目录到工作副本的状态。我已经尝试过 svn update、svn cleanup 以及其他 UI(TortoiseSVN 和 Cornerstone)修复快捷方式,但似乎无法重新同步 - 即无需回滚到以前的修订版或签出新副本。

我认为必须删除本地工作副本和远程仓库上的目标目录,更新工作副本,将新目录添加到工作副本,然后提交到仓库;但我不确定我可能遗漏的细节或任何遗漏的步骤或微妙之处。我正在升级的模块对站点应用程序非常重要,因此我需要在第一时间就做好这一点——因为这是在生产服务器上进行的——并且必须快速完成。如果有人能清楚地标出这些步骤,我将不胜感激。

【问题讨论】:

    标签: svn replace directory repository working-copy


    【解决方案1】:

    为了使这更容易,您可以通过在目录不存在的情况下创建单个“损坏”修订的方式来执行此操作。

    1. svn up 更新您的工作副本
    2. svn delete <directory> 摆脱当前目录
    3. svn commit -m 'Deleted old module'
    4. 在新目录中复制到工作副本
    5. svn add <directory> 添加您的新目录结构
    6. svn commit -m 'Added new module'

    This question 提供了有关如何使用“供应商分支”的详细信息,这可能会被证明是更适合您的情况的解决方案。

    【讨论】:

    • 感谢您的建议,非常有帮助。实际上,我最终得到了一个修改后的工作流程,我必须使用 TortoiseSVN 从远程桌面连接到 Win2K3 服务器执行我的生产提交。 TortoiseSVN 有自己的捆绑版本的 SVN,它有自己奇怪的命令行实现和自动化脚本语法。由于只使用上下文菜单命令,我发现通过以下方式本地化更新更容易: 1. cd 2. 删除根目标目录的内容 3. svn commit 4. 复制新的模块文件/目录 5. svn添加 6. svn commit 成功!
    • 我看不出为什么应该在 2 次提交中完成此操作。您可以在工作副本中执行此操作并将其作为单个操作提交。 SVN 将始终将其视为“删除”+“添加”,除了具有相同名称的文件,它将选择那些作为“替换”。
    【解决方案2】:

    使用 TortoiseSVN 的 RepoBrowser 很简单。只需删除旧文件夹,然后拖放新文件夹即可。

    【讨论】:

      【解决方案3】:

      如果你真的需要在一次提交中更新目录结构,你可以使用 WinMerge :

      1. 递归比较两棵树,使用 SVN 过滤器避免比较 .svn 目录
      2. 从 WC 中删除新结构中不存在的文件和目录
      3. 将仅存在于新结构中的文件和目录添加到您的 WC
      4. 将两种结构中存在的所有文件替换为 WC 中的新文件
      5. 提交

      【讨论】:

      • 你的方法是我过去是如何完成这些滚动更新的,但是对于根本不同的模块结构,我更喜欢通过删除 -> 替换 -> 提交完全从一个新副本开始,而不是拥有选择性地删除升级路径中的文件和目录。 @Simon 的建议以及我对 TortoiseSVN 的附录,在这种能力下工作得很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多