簡體   English   中英

遞歸列出所有svn:externals?

[英]List all svn:externals recursively?

如何在目錄中(遞歸)獲取所有svn:externals的列表? 有任何實用程序嗎?

(我正在使用Windows(和烏龜))

我有一堆svn:externals鏈接到項目的不同共享部分,而我分支時,查找所有外部元素並更改它們通常很容易出錯,以便鏈接到新分支中的路徑。

在工作副本的根目錄中執行以下操作:

svn propget svn:externals -R

如下面的評論中所討論的,這未在外部列出外部。

給TortoiseSVN用戶的注意事項:TortoiseSVN安裝程序中有一個選項還可以安裝SVN命令行客戶端。 默認情況下不啟用此選項。

手動更改所有這些外部屬性聽起來很乏味。 您是否看過Subversion 1.5中新增的外部功能

Subversion 1.5在緩解這些挫敗感方面邁出了巨大的一步。 如前所述,新的外部定義格式中使用的URL可以是相對的,並且Subversion提供了語法魔術,用於指定URL相對性的多種形式。

../

相對於設置svn:externals屬性的目錄的URL

^ /

相對於版本庫中svn:externals屬性的根目錄

//

相對於設置svn:externals屬性的目錄的URL方案

/

相對於版本svn:externals屬性的服務器的根URL

也許其中之一會有所幫助? 我猜這完全取決於您的分支方式和存儲庫結構。

我的TortoiseSVN解決方法:

從SVN上下文菜單中打開“分支/標簽...”對話框。 下部對話框顯示了所有外部組件,包括嵌套的外部組件。

也許,作為一種解決方法,您可以采用以下方式來構造項目:將所有外部組件都設置在同一文件夾中,例如在Trunk下面的項目文件夾中。 (這並不意味着所有外部文件夾的深度都必須相同。)然后,您可以右鍵單擊項目文件夾,然后依次單擊“屬性...”,“ Subversion”選項卡,“屬性...”雙擊svn:externals。

我使用了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腳本將無法在其中運行。

我接受了Daniel Alder的回答 ,刪除了svnversion調用,並使其進行了遞歸(注意:如果源或目標中有空格,則read abcde無效)。 這是一個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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM