更新svn checkout到指定日期(包括外部引用)

8
我想执行一个svn更新到特定的日期,我可以使用svn update -r {2010-10-17}命令来实现。但是,当遇到外部文件时,它会在不传递-r {2010-10-17}选项的情况下对其进行更新。这导致我们获得了基本代码的正确过去版本,但许多外部文件的最新(不需要的)版本。
如何在更新到特定版本或日期时正确遍历外部文件?
(注意:我理解这里的错误可能是使用没有明确指定版本的外部文件。)

2
你看到这个了吗:https://dev59.com/dHRB5IYBdhLWcg3wN1EQ - Ozair Kafray
4个回答

6

我希望有人能够在bash和cmd脚本中实现我的常识逻辑(仅限于某些区域的目录类型外部),并且我们将得到这个重复问题的“最终答案”。

你的基本任务是:

  • svn up你的超级库到过去所需的点(更新到日期/没有时间/不是最好的选择,但可行)
  • 获取项目中所有外部路径的列表(因为外部定义可以存在于树的任何位置),从WC-root svn propget svn:externals -R(-R以便在没有大量cd的情况下检查整个树)
  • 对于propget输出中的每个字符串(格式如. - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib):相对于第一个字段的最后一个字段cd,这又是相对于根的相对路径,然后svn up到与超级repo执行的相同点:svn update -r {2010-10-17}

结果将是混合工作副本,但超级库和外部将处于“过去某个修订版本”的状态。

注意:

构建具有外部目录的本地路径的其他示例(真正嵌套的WC)更为复杂。

对于

>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

我的工作副本中外部文件的最终路径将是(相对于工作副本根目录)

tags\1.0.1\lib
trunk\lib

0

如果有人尝试将已经检出的Subversion存储库更新以使本地文件日期与存储库日期同步,我在此添加答案,因为我想进行FS时间戳比较。

我创建了这个一行命令来完成这个技巧(但在使用之前请阅读下面的行):

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个并行的shtouch来实际进行更新。根据系统负载情况,降低这个值可能是明智的。在一个小型的基于i3的Intel NUC上,使用1000个进程实际上非常完美,使用80-95%的CPU(100%通常意味着CPU超载)。如果不确定,请打开例如htop并测试不同的值,但每次只运行几秒钟,因为它需要从头开始运行。

对于一个存储在USB硬盘上的小型约3GB SVN仓库,这个操作大约需要5分钟。

set +x打开详细执行模式,在执行touch之前使用,这样您就可以观察它的运行情况。如果您想要非详细执行模式,请删除该命令。


0

我们只在其他项目中包含整个目录:

  • mainprj/bin/subprj1
  • mainprj/bin/subprj2
  • mainprj/dat/subprj1
  • mainprj/dat/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
据我所知,如果你不改变外部配置的话是无法实现这个目标的。但是,改变外部配置会影响到所有人,因此只需提交一次更改并更新,问题就解决了。

1
你能解释一下“外部配置”是什么吗?你是指svn:externals属性吗?如果你的意思是我们的外部属性应该都使用明确的修订号,那么我可能同意你的看法,但我不能回去编辑许多没有这种情况的提交。也许我误解了你的建议。 - pauldoo
抱歉,是的,svn:externals属性。你只在一两个地方使用它了,对吧?不过,现在重新阅读你的问题,你想要回到过去,这也会重置svn:externals属性。所以,是的,你应该在外部引用中使用明确的版本号,现在你需要手动完成它 :) - Karl P

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