以递归方式列出所有svn:externals?

时间:2009-03-25 14:30:46

标签: svn tortoisesvn

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

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

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

6 个答案:

答案 0 :(得分:133)

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

svn propget svn:externals -R

正如下面的评论所述,这并没有列出外部的外部因素。

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

答案 1 :(得分:15)

手动更改所有这些外部属性听起来很乏味。你看过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 :(得分:8)

我对TortoiseSVN的解决方法:

打开"分支/标记......" SVN上下文菜单中的对话框。下方对话框显示所有外部,包括嵌套外部。

答案 3 :(得分:0)

也许,作为一种解决方法,您可以构建项目,使所有外部设置在同一文件夹上,例如在Trunk下面的项目文件夹中。 (这并不意味着顺便说一下所有外部文件夹必须处于相同的深度。)然后,您可以右键单击项目文件夹,然后右键单击属性...,然后选择Subversion选项卡,再选择属性...然后双击svn:externals。

答案 4 :(得分: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脚本不会在那里工作。

答案 5 :(得分:0)

我拿了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
}