递归列出所有 svn:externals?

Posted

技术标签:

【中文标题】递归列出所有 svn:externals?【英文标题】:List all svn:externals recursively? 【发布时间】:2010-10-15 11:22:36 【问题描述】:

如何获取目录中所有 svn:externals 的列表(递归)?有什么实用程序吗?

(我使用的是 Windows(和乌龟))

我有一堆 svn:externals 链接到我项目的不同共享部分,我在分支时通常很容易出错,找到所有外部并更改它们以便链接到新分支中的路径。

【问题讨论】:

这个问题也出现在***.com/questions/5118320/… 【参考方案1】:

手动更改所有这些外部属性听起来很乏味。你看过 Subversion 1.5 中添加的new functionality for externals 吗?

Subversion 1.5 在缓解这些挫败感方面迈出了一大步。如前所述,新的外部定义格式中使用的 URL 可以是相对的,Subversion 为指定多种 URL 相对性提供了语法魔法。

../

    相对于设置了 svn:externals 属性的目录的 URL

^/

    相对于 svn:externals 属性所在版本库的根目录

//

    相对于设置了 svn:externals 属性的目录的 URL 架构

/

    相对于 svn:externals 属性版本所在服务器的根 URL

也许其中之一会有所帮助?我想这取决于您的分支方式以及您的存储库结构是什么样的。

【讨论】:

【参考方案2】:

在工作副本的根目录中执行以下操作:

svn propget svn:externals -R

正如下面的 cmets 中所讨论的,这并没有在 externals 中列出 externals。

TortoiseSVN 用户注意事项:TortoiseSVN 安装程序中有一个选项可以安装 SVN 命令行客户端。此选项默认不启用。

【讨论】:

这只是给了我所有外部的列表以及它们指向的位置.. 但不是外部的“位置”.. 即如果我有 lib\my_ex 作为外部我只得到 my_ex http :/svnlink这里 @ShoeLace:您必须使用较旧的 SVN,因为在 1.6.1 中,输出确实包含此信息。 抱歉,我不得不投反对票,因为 a) 这不会输出 all 外部; fx,如果我们有外部文件夹并且该文件夹内的某处有外部 - 这不会显示 b)问题被标记为 tortoise svn,但答案与命令行客户端有关 @pmod: a) 我不知道,但这对我来说似乎是一个 SVN 错误,而不是我的错误。 b) TortoiseSVN 1.7 安装程序包括命令行客户端! 递归与调用命令的工作副本的文件夹结构有关。它与嵌套在外部内部的外部无关。所以我不认为这是一个错误。否则,这将使操作在持续时间方面更加不可用。【参考方案3】:

也许,作为一种解决方法,您可以将所有外部设置在同一个文件夹中,例如在 Trunk 下方的项目文件夹中。 (这并不意味着所有外部文件夹都必须处于相同的深度。)然后您可以右键单击您的项目文件夹,然后是 Properties...,然后是选项卡 Subversion,然后是 Properties... 然后双击 svn:externals。

【讨论】:

【参考方案4】:

我使用了 Wim Coenen 的答案并编写了以下脚本来创建所有修订的列表:

getSvnRevs() 
  cd "$1"
  wcver="$(svnversion)"
  [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
  echo "$1: $wcver"
  svn propget svn:externals -R | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      wcdir="$wcparent/$c"
      [ -z "$e" ] || panic "Invalid format #1"
    else
      [ -n "$wcparent" ] || panic "Invalid format #2"
      wcdir="$wcparent/$a"
      [ -z "$c" ] || panic "Invalid format #3"
    fi
    [ -d "$wcdir" ] || panic "Invalid directory: $wcdir"
    wcver="$(svnversion "$wcdir")"
    [ -n "$wcver" ] || panic "Unable to get version for $wcdir"
    echo "$1/$wcdir: $wcver"
  done

幸运的是,我没有嵌套的外部,所以我不必对此进行测试,我想它不会起作用。但是如果你需要这个,递归调用这个函数可能就足够了。此外,我从未使用需要转义的文件名进行测试。那时它可能不会工作。

免责声明:我知道最初的问题是关于 windows 的,除非你使用 cygwin 或类似的,否则 shell 脚本不会在那里工作。

【讨论】:

【参考方案5】:

我对 TortoiseSVN 的解决方法:

从 SVN 上下文菜单中打开“分支/标签...”对话框。下面的对话框显示了所有的外部,包括嵌套的外部。

【讨论】:

看起来 TortoiseSVN 并没有在 svn:externals 中递归查找 svn:externals,所以这和 svn propget svn:externals -R 是一样的。【参考方案6】:

我采用了Daniel Alder's answer,删除了 svnversion 调用,并使其递归(注意:如果源或目标中有空格,read a b c d e 将不起作用)。这是一个 bash 脚本,所以你要么需要 Cygwin 之类的东西,要么使用 Windows Subsystem for Linux。

getSvnExternals() 
  svnbase="$1"
  svnpath="$2"
  svn propget svn:externals -R "$svnbase/$svnpath" 2> /dev/null | while read a b c d e; do
    [ -n "$a" ] || continue
    if [ "$b" = "-" ]; then
      wcparent="$a"
      external="$c"
      wcdir=$(echo "$wcparent/$d" | sed s#^./##)
      [ -z "$e" ] || echo "WARNING: Invalid format #1. line='$a $b $c $d $e'"
    else
      [ -n "$wcparent" ] || echo "WARNING: Invalid format #2. wcparent=$wcparent"
      external="$a"
      wcdir=$(echo "$wcparent/$b" | sed s#^./##)
      [ -z "$c" ] || echo "WARNING: Invalid format #3. line='$a $b $c $d $e'"
    fi
    echo "$1/$wcdir: $external"
    ## recurse into external directory
    [ -d "$wcdir" ] && getSvnExternals "$1/$wcdir"
  done

【讨论】:

以上是关于递归列出所有 svn:externals?的主要内容,如果未能解决你的问题,请参考以下文章

svn中的外链检测

如何开始使用 svn:externals?

在 CVS 存储库中指向 SVN Externals

递归控制-列出所有组合

递归列出所有扩展名为 .txt 的文件

IO流 列出目录下所有内容-递归