如何在 SVN 中替换文件夹中的所有文件,但将其视为正常修订?

How do I replace all files in a folder in SVN, but treat as a normal revision?

我的情况是,我有两个 tar 文件,其中包含不同版本的项目源代码。我想将旧版本的代码添加到 Subversion 服务器,然后用新版本替换源文件并重新提交。这样,每个源文件都会在 SVN 中跟踪两个修订,并且很容易看到代码的两个版本之间所做的所有更改。特别是,我想要的行为相当于执行以下操作:

  1. 签入代码的第一个版本(当然,这很简单。)
  2. 在工作副本中,svn delete 新版本中不存在的所有文件和目录。
  3. 将新版本的代码(包括所有文件和目录)复制到工作副本中的旧版本上。
  4. svn add 所有新文件和文件夹。
  5. 像正常提交一样提交工作副本。

如果您碰巧有一个脚本可以执行上述操作(最好是 bash 脚本),那就太好了。另一方面,如果有一个 svn 命令已经执行了这个行为,那也很好。

可以从正常的 Linux 命令行 svn 客户端或从 Windows 上的 TortoiseSVN 执行的任何操作都可以(或者甚至是它们的组合,如果需要的话),因为我两者都有。

以防万一,涉及的目录树很大,我不希望对每个单独的文件手动执行上述序列。


我已经尝试过的:

我已经尝试将两个代码树作为单独的分支签入,然后使用 TortoiseSVN 的 "Merge two different trees" 选项将包含较新代码的分支合并到包含较旧代码的分支的工作副本中。虽然这确实导致分支被更新为较新的代码,但 Subversion 将其视为只是替换文件,不留下每个文件的修订历史记录。也就是说,它把它当作所有旧文件都被删除,新文件作为单独的文件添加,而不是对现有文件的更新(这意味着 "show log" 没有具体显示哪些文件被修改, "Diff with previous version" 任何给定文件在 TortoiseSVN 中都无法正常工作。)

这听起来像是 TortoiseSVN 的 "vendor branch here" 功能的工作。

首先添加并提交第一个 tar 文件的内容。将第二个 tar 文件的内容提取到其他目录。右键单击将该文件夹拖到您的工作副本中,然后选择 "vendor branch here"。这主要是为您在自己的存储库中跟踪的第 3 方代码设计的,但它也适用于您的使用。