2009-03-25 22 views
80

Come posso ottenere un elenco di tutti gli svn: esterni (in modo ricorsivo) in una directory? C'è qualche utilità per questo?Elenca tutti gli svn: esterni in modo ricorsivo?

(sto usando Windows (e tartaruga))

Ho un mucchio di svn: gli esterni di collegamento alle diverse parti condivise del mio progetto e ho quando ho ramo è errore di solito piuttosto incline a trovare tutti gli esterni e li ha modificati in modo che il collegamento ai percorsi all'interno del nuovo ramo.

+0

questa domanda è anche presente a http://stackoverflow.com/questions/5118320/find-paths-with-svnexternal-properties-with-certain-string –

risposta

125

fare quanto segue nella root della vostra copia di lavoro:

svn propget svn:externals -R 

Come discusso nei commenti qui sotto, questo non elenca gli esterni in esterni.

Nota per utenti TortoiseSVN: è disponibile un'opzione nel programma di installazione TortoiseSVN per installare anche il client della riga di comando SVN. Questa opzione non è abilitata per impostazione predefinita.

+0

che appena mi dà una lista di tutti gli esterni e dove puntano .. ma non la 'posizione' dell'esterno .. ie se ho lib \ my_ex come esterno ottengo solo my_ex http:/svnlinkhere – ShoeLace

+3

@ShoeLace: devi essere funziona con un SVN precedente perché in 1.6.1 l'output * fa * contiene questa informazione. –

+0

Buona risposta ... ma come posso farlo in Windows con TortoiseSVN? - Non ho un 'svn.exe' sul mio computer, ma ho installato TortoiseSVN. – Eddified

15

Cambiare manualmente tutte quelle proprietà esterne è noioso. Hai guardato il new functionality for externals aggiunto in Subversion 1.5?

Subversion 1.5 compie un enorme passo avanti per alleviare queste frustrazioni. Come accennato in precedenza, gli URL utilizzati nel nuovo formato di definizione degli esterni possono essere relativi e Subversion fornisce la sintassi magica per specificare più sapori della relatività URL.

../

      relativa alla URL della directory su cui la proprietà svn: externals è impostata

^/

      relativo alla radice del repository in cui la proprietà svn: externals è versionata

//

      relativa allo schema del URL della directory su cui la proprietà svn: externals è impostata

/

      relativa all'URL principale del server su cui lo svn: proprietà esterna è la versione

Forse uno di quelli sarebbe di aiuto? Credo che dipenda esattamente da come si sta ramificando e da come si presenta la struttura del repository.

0

Forse, per ovviare al problema, è possibile strutturare il progetto in modo che tutti gli elementi esterni siano impostati nella stessa cartella, ad esempio nella cartella del progetto appena sotto il tronco. (Questo non significa che tutte le cartelle esterne devono essere alla stessa profondità). Quindi puoi fare clic con il tasto destro sulla cartella del progetto, poi su Proprietà ..., poi sulla scheda Subversion, poi su Properties ... quindi fare doppio clic su svn: esterni.

0

Ho usato la risposta di Wim Coenen e scrisse il seguente script per creare una lista di tutte le revisioni:

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 
} 

Per fortuna, non ho esterni nidificati, quindi non ho dovuto provare questo e immagino che non funzionerebbe. Ma se ne hai bisogno, è probabilmente sufficiente chiamare questa funzione in modo ricorsivo. Inoltre, non ho mai provato i nomi dei file che devono essere salvati. Probabilmente non funzionerà allora.

NOTA BENE: So che la domanda iniziale riguardava Windows, e lo script di shell non funzionerà lì a meno che non si utilizzi cygwin o simili.

7

La mia soluzione per TortoiseSVN:

Aprire il "ramo/tag ..." finestra di dialogo dal menu contestuale SVN. La finestra di dialogo inferiore mostra tutti gli elementi esterni, inclusi gli elementi esterni nidificati.

+0

Sembra che TortoiseSVN non cerchi in modo ricorsivo svn: esterni in svn: esterni, quindi questo è lo stesso di fare 'svn propget svn: externals -R'. – paulie4

0

Ho preso Daniel Alder's answer, rimosso le chiamate di svnversion e lo ha reso ricorsivo (NOTA: read a b c d e non funziona se c'è uno spazio nell'origine o nella destinazione). Questo è uno script bash, quindi avrai bisogno di qualcosa come Cygwin o usare lo 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 
} 
Problemi correlati