8

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

如何更新到特定的修订版或日期并通过外部正确地进行递归?

(注意:我知道这里的错误可能是使用未指定明确修订的外部。)

4

4 回答 4

5

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

您的基本任务是:

  • svn up您的超级回购到过去需要的点(更新到日期/并且没有时间/是,顺便说一句,不是最佳选择,但是 - 适用)
  • 从 WC-root 获取项目中所有外部的路径列表(因为外部定义可以存在于树中的任何位置)svn propget svn:externals -R(-R 以便检查整个树而没有很多cd
  • 对于 propget 输出中的每个字符串(格式如下. - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib): cd 到字符串的最后一个字段 / 相对于第一个字段,这又是到 root/ 和 svn 的相对路径,因为它是为超级回购完成:svn update -r {2010-10-17}

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

笔记:

在更复杂的情况下使用外部(实际上是嵌套的 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

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

tags\1.0.1\lib
trunk\lib
于 2013-03-27T20:36:16.977 回答
0

如果有人试图更新已签出的颠覆存储库以将本地文件日期同步到存储库日期,我将添加此答案,我想这样做,以便进行 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个副本shtouch进行实际更新。根据系统负载,降低此值可能是明智之举。在基于 i3 的微型 Intel NUC 1000 进程上,实际上证明是完美的,使用 80-95% 的 CPU(100% 通常意味着 CPU 过载)。如果有疑问,请打开 eghtop并使用不同的值进行测试 - 但只运行几秒钟,因为它每次都需要从头开始运行。

对于 USB 硬盘上的 3GB 小型 SVN 存储库,这需要大约 5 分钟才能运行。

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

于 2017-09-02T08:08:46.050 回答
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
于 2019-06-28T09:07:20.023 回答
-3

据我所知,如果不更改外部配置,您将无法做到这一点。但是,更改外部配置会为每个人更改它,所以它只是一次提交和更新,你就完成了。

于 2010-11-17T12:22:59.480 回答