我正在开发一个SVN控制下的大型项目.代码库的许多部分都被检查为外部,但正在被其他人积极处理.
我想更新我的整个工作副本,外部和所有,以便它反映了特定时间点的各种存储库的HEAD.我最初的尝试是:
svn up -r'{20090324}'
这会将当前目录更新为指定日期,但会将所有外部更新为当前日期.一次更新一个外部组件按预期工作.
我理解,由于外部的性质,单个更新无法使用修订号,但为什么它不适用于日期?
什么是实现我正在寻找的时间点效果的最佳方法,而不必维护一个硬编码各种外部的脚本?
我正在运行Linux系统.
这是低效的,因为它比(通常)需要更频繁地调用svn更新.否则,它很短暂的甜蜜:
Unix的:
find . -name .svn -execdir svn update -r {2010-08-30} \;
视窗:
forfiles /m .svn /s /c "cmd /c svn up -r {2010-08-30}"
使用svn:externals时,使用没有修订号的外部通常是个坏主意.这意味着很难将外部版本与包含项目的版本相关联; 我知道这很困难,从试图在包含外部的项目中追踪一些历史记录,我将不得不猜测哪个修订版与包含项目中的修订版相对应(有时它更早,因为有人更新了外部项目和然后更新了包含项目,有时后来因为某人直接在外部结帐中编辑了文件然后提交了它.
相反,正如提示框中提到的一些段落到subversion书中的externals部分,你应该总是提交带有修订号的外部.这样,每当您签出包含项目的特定修订版时,也会检出外部的相应修订版.它确实意味着更多的工作,因为你必须每次都更新svn:externals属性中的修订号(我们编写了一个自动执行的脚本),但从长远来看,这是一个更好的解决方案.
编辑:这是我们使用的脚本的骨架(一个rake任务),用于方便地更新外部并保持所有内容同步.
desc 'Update external for this project (rake update_external r=17789)' task :update_external do |t| rev = ENV['r'] rev =~ /^\d+$/ or raise "Invalid SVN revision number: r=<#{rev}>" # Update the project. sh "svn update" URL = 'svn+ssh://example.com/external/trunk' sh "svn propset svn:externals 'external -r#{rev} #{URL}' containing/directory" # Update again -- to put the externals back to the right revision. sh "svn update" end