Elenca tutti gli svn: externals in modo ricorsivo?


94

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

(Sto usando Windows (e tartaruga))

Ho un sacco di svn: externals che si collegano a diverse parti condivise del mio progetto e io quando eseguo il branch di solito è abbastanza incline all'errore trovare tutti gli esterni e cambiarli in modo che il collegamento ai percorsi all'interno del nuovo ramo.


Questa domanda è presente anche su stackoverflow.com/questions/5118320/…
Thiago Burgos

Risposte:


144

Effettua le seguenti operazioni nella radice della tua copia di lavoro:

svn propget svn:externals -R

Come discusso nei commenti seguenti, questo non elenca gli esterni negli esterni.

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


questo mi dà solo un elenco di tutti gli esterni e dove puntano .. ma non la 'posizione' dell'esterno .. cioè se ho lib \ my_ex come esterno ottengo solo my_ex http: / svnlinkhere
ShoeLace

4
@ShoeLace: è necessario lavorare con un vecchio SVN perché in 1.6.1 l'uscita fa contengono queste informazioni.
Wim Coenen

1
Mi dispiace ma devo votare per difetto poiché a) questo non produrrà tutti gli esterni; fx, se abbiamo esterno alla cartella e c'è un esterno da qualche parte all'interno di questa cartella - questo non verrà visualizzato b) la domanda è contrassegnata con tortoise svn, ma la risposta è correlata al client della riga di comando
pmod

2
@pmod: a) Non lo sapevo, ma mi sembra un bug SVN piuttosto che un errore da parte mia. b) Il programma di installazione di TortoiseSVN 1.7 include il client a riga di comando!
Wim Coenen

1
La ricorsività è rispetto alla struttura delle cartelle della copia di lavoro in cui si richiama il comando. Non è rispetto agli esterni nidificati all'interno degli esterni. Quindi non penso che sia un bug. In caso contrario, ciò renderebbe l'operazione ancora più inutilizzabile in termini di durata.
Frank Rem

15

Modificare manualmente tutte queste proprietà esterne sembra noioso. Hai esaminato la nuova funzionalità per gli esterni aggiunta in Subversion 1.5?

Subversion 1.5 fa 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 magia della sintassi per specificare più tipi di relatività degli URL.

../

    Relativo all'URL della directory su cui è impostata la proprietà svn: externals

^ /

    Relativo alla radice del repository in cui è stata eseguita la versione della proprietà svn: externals

//

    Relativo allo schema dell'URL della directory su cui è impostata la proprietà svn: externals

/

    Relativo all'URL radice del server su cui viene eseguita la versione della proprietà svn: externals

Forse uno di quelli aiuterebbe? Immagino che dipenda esattamente da come stai ramificando e come appare la struttura del tuo repository.


8

La mia soluzione alternativa per TortoiseSVN:

Apri la finestra di dialogo "Ramo / tag ..." dal menu contestuale SVN. La finestra di dialogo inferiore mostra tutti gli esterni inclusi gli esterni nidificati.


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

0

Forse, come soluzione alternativa, potresti strutturare il tuo progetto in modo tale che tutti gli esterni siano impostati sulla stessa cartella, ad esempio sulla cartella del progetto appena sotto Trunk. (Ciò non significa che tutte le cartelle esterne debbano essere alla stessa profondità, comunque.) Quindi puoi fare clic con il pulsante destro del mouse sulla cartella del progetto, quindi Proprietà ..., quindi la scheda Subversion, quindi Proprietà ... fare doppio clic su svn: externals.


0

Ho usato la risposta di Wim Coenen e ho scritto il seguente script per creare un elenco 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
}

Fortunatamente, non ho nidificati esterni, quindi non ho dovuto testarlo e immagino che non avrebbe funzionato. Ma se ne hai bisogno, probabilmente è sufficiente chiamare questa funzione in modo ricorsivo. Inoltre, non ho mai provato con nomi di file che necessitano di escape. Probabilmente allora non funzionerà.

NOTA BENE: So che la domanda originale riguardava Windows e lo script di shell non funzionerà lì a meno che tu non stia usando Cygwin o simili.


0

Ho preso la risposta di Daniel Alder , ho rimosso le chiamate svnversion e l'ho resa ricorsiva (NOTA: read a b c d enon funziona se c'è uno spazio nell'origine o nella destinazione). Questo è uno script bash, quindi avrai bisogno di qualcosa come Cygwin o utilizzerai il sottosistema Windows per 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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.