将svn checkout更新到特定日期,包括外部

时间:2010-11-17 12:17:41

标签: svn history svn-externals

我想对特定日期执行svn更新,我可以使用svn update -r {2010-10-17}执行此操作。不幸的是,当遇到外部时,它将在外部进行更新而不通过-r {2010-10-17}选项。这导致我们获得了基本代码的正确过去版本,但是许多外部的最新(不需要的)版本。

如何更新到特定版本或日期,并通过外部设备正确递归?

(注意:我理解这里的错误可能是使用外部而没有指定明确的修订。)

4 个答案:

答案 0 :(得分:5)

我希望,任何人迟早都会将我的常识逻辑(局限于某些领域的目录类型外部)实现为bash和cmd-script,我们将获得“明确答案”对这个重复的问题

您的基本任务是:

  • svn up你的超级回购过去需要的点(更新到日期/没有时间/是BTW,不是最好的选择,但是 - 可以理解)
  • 获取项目中所有外部的路径列表(因为外部定义可以存在于树中的任何位置),来自WC-root svn propget svn:externals -R( - R,以便检查整个树而不需要很多{{1 }})
  • 对于propget输出中的每个字符串(格式如此cd):cd到字符串的最后一个字段/相对于第一个字段,这又是root / svn up的相对路径同一点,正如为superrepo所做的那样:. - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib

结果你将拥有混合工作副本,但是superrepo和externals将处于“过去的某些修订”状态

注意:

在更复杂的情况下,使用externals(真正嵌套的WC)构建本地目录路径的附加示例。

有关

svn update -r {2010-10-17}

我的WC中的外部决赛路径(相对于WC-root)

>svn propget svn:externals -R
tags\1.0.1 - -r 2 https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib@2 lib

trunk - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib

答案 1 :(得分:0)

我正在添加此答案,以防有人试图更新已经检出的subversion存储库以将本地文件日期同步到回购日期,我想这样做我可以做FS时间戳比较。

我让这个oneliner做了诀窍(但在使用它之前阅读下面的行):

svn info --show-item last-changed-date -R | xargs -I{} -P1000 -n1 sh -c 'x="{}"; set -x; exec touch -d "${x%% *}" "${x#* }"'

注意: -P1000指定xargs应运行 1000 sh的同时副本和touch进行实际更新。根据系统负载,降低此值可能是明智之举。在基于i3的小型英特尔NUC 1000上,过程实际上是完美的,使用80-95%的CPU(100%通常意味着CPU过载)。如果有疑问,请打开例如htop并使用不同的值进行测试 - 但只运行几秒钟,因为每次都需要从头开始运行。

对于USB硬盘上的小型~3GB SVN回购,大约需要5分钟才能运行。

set +x打开详细执行,我在执行touch之前执行此操作,以便您可以观看它的运行。如果您想要非详细执行,请删除该命令。

答案 2 :(得分:0)

我们在其他项目中仅包括整个目录:

  • mainprj / bin / subprj1
  • mainprj / bin / subprj2
  • mainprj / 日期 / subprj1
  • mainprj / 日期 / subprj2
  • subprj1 / bin #包含在mainprj / bin / subprj1
  • subprj1 / dat #包含在mainprj / dat / subprj1
  • subprj2 / bin #包含在mainprj / bin / subprj2
  • subprj2 / dat #包含在mainprj / dat / subprj2

采用这种布局svn propget svn:externals -R返回

# cd mainprj
# svn propget svn:externals -R
bin - subprj1 svn+ssh://svnserver/svn/subprj1/trunk/bin
subprj2 svn+ssh://svnserver/svn/subprj2/trunk/bin

dat - subprj1 svn+ssh://svnserver/svn/subprj1/trunk/dat
subprj2 svn+ssh://svnserver/svn/subprj2/trunk/dat

,您可以按如下所示更新到修复日期:

svn propget svn:externals -R |\ 
   grep -vE '^$' | sed -e "s/^[^-]* - //" |\
   while read line; do \
      pushd ${line##*/}; \
         svn update -r {2019-04-26} ${line%% *}; \
      popd; \
   done

答案 3 :(得分:-3)

就我能够解决而言,如果不改变外部配置,就无法做到这一点。但是,更改外部配置会为每个人更改它,因此它只需一次提交和更新即可完成。