在Subversion中替换整个目录树的最佳方法是什么?

11

在我的Subversion项目中,我有一些包含其他开源项目的目录,我的代码需要这些项目。例如ffmpeg,freetype,matrixssl等。

更新SVN以保存其中一个项目的最新版本的最佳方法是什么?

基本上,我将执行以下操作(以使用ffmpeg为例):

1) Rename current ffmpeg folder to ffmpeg.old
2) Download new version of ffmpeg from net
3) Make sure it and my code compile and work fine together
4) Update subversion to now hold the "new" version of ffmpeg
5) Delete ffmpeg.old directory tree
5个回答

11
你可以查看svnbook关于vendor branches的内容。这正是你想要实现的。
你可以使用svn_load_dirs.pl来替换手动步骤1-5。svn_load_dirs.pl还会跟踪新添加、移动或删除的文件。

2

我在使用CMake时遇到了同样的情况,我将二进制Win32版本保留在我们的供应商目录中:

branches/
trunk/
vendor/
    cmake/
        cmake-2.6.0/
        cmake-2.6.1/
        cmake-2.6.2/
        ...

我随后使用svn:externals来引用我正在使用的CMake版本。这使得测试升级到新版本变得非常容易,同时也清楚地知道我正在使用哪个版本的CMake。


所以本质上svn项目包含所有版本,你只需将别名指向当前版本? - KPexEA
是的。删除旧文件没有意义,因为供应商目录从未直接检出;它只是使用svn:externals进行引用。 - JesperE

1
除了步骤1和5以外,其他都是正确的 - 如果步骤3失败,请使用svn还原功能恢复更改。

这个程序会处理删除在新版本中不再使用的文件吗?还是我需要手动检测和删除它们? - KPexEA
使用 svn delete 命令删除旧的树,然后再下载最新版本。这样就不需要解决任何问题了,如果第三步失败了,就还原回去。反正 SVN 中的东西并没有真正被删除。 - Dandikas
svn_load_dirs.pl 会处理已删除的文件。 - DanJ

0

我认为你有两个选择。

A)

  1. SVN删除所有文件。
  2. 获取当前版本并使其工作。
  3. SVN添加所有文件。

优点:将确保不会保留任何不在最新版本中的额外文件。

缺点:可能耗时。

B)

  1. 下载并安装新版本覆盖旧版本。
  2. 使其工作。
  3. SVN添加任何新文件。

优点:您可以查看工具文件中发生了什么变化。

缺点:可能会出现混乱。根据工具,覆盖可能会导致错误。


在这两种情况下,步骤1有什么作用?听起来像是你还没有使用SVN的旧习惯。 - Dandikas
已修复。我太过关注问题本身了。 - Tilendor

0
如果一些供应商项目也使用Subversion,您可以将svn:externals属性添加到您的分支/主干的父目录中。
请查看 SVN书以获取更多详细信息。

真的,但这会让你完全依赖于供应商的代码库。请参考答案https://dev59.com/r3VC5IYBdhLWcg3ww0Dr#192965,其中描述了供应商分支的更受控制的方法。 - Martijn Heemels

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接