递归列出所有svn:externals?


94

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

(我正在使用Windows(和乌龟))

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


Answers:


144

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

svn propget svn:externals -R

如下面的评论中所讨论的,这未在外部列出外部。

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


那只是给了我所有外部对象及其指向的列表..但是没有外部对象的“位置” ..即,如果我将lib \ my_ex作为外部对象,我只会得到my_ex http:/ svnlinkhere
ShoeLace

4
@ShoeLace:您必须使用较旧的SVN,因为在1.6.1中,输出确实包含此信息。
Wim Coenen

1
对不起,但由于a)这将不会输出所有外部信号,因此我必须对此投票。FX,如果我们在文件夹外部,并且在此文件夹中某个外部位置-不会显示b)问题被标记为svn龟,但答案与命令行客户端有关
pmod

2
@pmod:a)我不知道,但是对我来说这似乎是一个SVN错误,而不是我自己的错误。b)TortoiseSVN 1.7安装程序包括命令行客户端!
Wim Coenen

1
递归是相对于您在其中调用命令的工作副本的文件夹结构而言的。它不是关于嵌套在外部外部的外部。因此,我认为这不是错误。否则,这将使操作在持续时间方面更加无法使用。
2014年

15

手动更改所有这些外部属性听起来很乏味。您是否看过Subversion 1.5中新增的外部功能

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

../

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

^ /

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

//

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

/

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

也许其中之一会有所帮助?我猜这完全取决于您的分支方式和存储库结构。


8

我的TortoiseSVN解决方法:

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


看起来TortoiseSVN不会在svn:externals中递归地查找svn:externals,所以这与do相同svn propget svn:externals -R
paulie4

0

也许,作为一种解决方法,您可以采用以下方式来组织项目:将所有外部组件都设置在同一文件夹中,例如,在Trunk下面的项目文件夹中。(这并不意味着所有外部文件夹的深度都必须相同。)然后,您可以右键单击项目文件夹,然后依次单击“属性...”,“ Subversion”选项卡,“属性...”双击svn:externals。


0

我使用了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脚本将无法在其中运行。


0

我接受了Daniel Alder的回答,删除了svnversion调用,并使其进行了递归操作(注意:read a b c d e如果源或目标中都没有空格,则不起作用)。这是一个bash脚本,因此您将需要Cygwin之类的东西,或者使用Windows 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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.