2009-08-07 28 views
23

Muy a menudo estoy sentado en medio de una copia de trabajo de subversión, y quiero hacer una rápida svn status para averiguar qué cambios he realizado desde la última registrarse. Sin embargo, svn status solo funciona en la carpeta actual y es secundaria. (Del mismo modo para svn up también)¿Cómo puedo encontrar la carpeta raíz de una copia de trabajo de subversión dada?

me gustaría una forma rápida de cambiar a la carpeta raíz de la copia de trabajo local para que pueda ejecutar un svn status y ver todos los archivos que han cambiado, tal vez un registro o una actualización , y luego volver al trabajo donde estaba antes.

Respuesta

14

Aquí es mi primera ir a una respuesta: Escribí un pequeño script de bash llamado svnbase:

#!/bin/bash -u 

# this command outputs the top-most parent of the current folder that is still 
# under svn revision control to standard out 

# if the current folder is not under svn revision control, nothing is output 
# and a non-zero exit value is given 

parent="" 
grandparent="." 

while [ -d "$grandparent/.svn" ]; do 
    parent=$grandparent 
    grandparent="$parent/.." 
done 

if [ ! -z "$parent" ]; then 
    echo $parent 
else 
    exit 1 
fi 

Así que ahora puedo hacer esto:

[~/work/scripts/XXX/code/speech-detection/framework]$ cd $(svnbase) 
[~/work/scripts/XXX]$ svn status 
?  code/speech-detection/framework/output.old 
[~/work/scripts/XXX]$ cd - 
/home/XXXX/work/scripts/XXX/code/speech-detection/framework 
[~/work/scripts/XXX/code/speech-detection/framework]$ 
+0

El siguiente paso lógico sería integrar esa serie de comandos que está escribiendo en el script en sí –

+2

Si prefiere una ruta absoluta en lugar de una relativa, inicie: 'grandparent = $ (pwd)', y cada ciclo: 'grandparent = $ (dirname parent)' –

+5

Esto solo funcionará para versiones de Subversion de hasta 1.6 . Las versiones 1.7 y posteriores solo tienen una sola carpeta '.svn' en la carpeta raíz. – ccpizza

2

No es posible. El SVN se puede consultar desde cualquier profundidad, y cualquier subdirector funciona como un nuevo checkout.

editar: script svnbase en el comentario anterior funciona, pero no es preciso.

+1

¿a qué te refieres con precisión? –

+1

El directorio principal puede ser una salida de otro repositorio. – stepancheg

7

Si usa git-svn como su cliente de Subversion, entonces puede interactuar de manera transparente con un repositorio de Subversion usando los comandos de Git localmente. Git te muestra automáticamente pendiente en todo el repositorio cuando usas comandos como git status en cualquier parte del árbol.

2

en realidad, si mira en su archivo .svn/entradas, encontrará la base enumerada allí generalmente alrededor de la línea 6. En cualquier caso, el formato de su url svn le dará algunas pistas importantes: P Oh, sí, me tomé la libertad de mirar, y svn info también te lo diré.

... suspiro, eso no es lo que preguntaste. Me gusta la solución en la primera respuesta: P

+1

la información svn lista la raíz de su repositorio, no la copia de trabajo. Por lo tanto, esto no ayudaría si no realizara la salida de todo el repositorio, mientras que 'svnbase' arriba todavía lo haría. –

+1

sí, de acuerdo. +1 :) – stran

+2

Con SVN 1.7 svn info mostrará una lista de la raíz de copia de trabajo. – Janosch

6

En Windows:

svn info . |findstr /C:"Working Copy Root Path:" 

En Linux:

svn info . |grep -F "Working Copy Root Path:" 

se puede asignar a una variable con un poco de manipulación de cadenas. versión de Windows:

FOR /F "delims=" %%i IN ('svn info . ^|findstr /C:"Working Copy Root Path:"') DO SET SOME_TEMP_VAR=%%i 
SET WORKING_COPY_ROOT=%SOME_TEMP_VAR:~24% 
3

en Linux con SVN, versión 1.9.3 (r1718519), corro esto: svn info --show-item wc-root

+0

Quizás quiso decir wc-root? 'svn help info' lista esto como una opción y parece funcionar correctamente. – Adam

+0

Sí, eso es lo que quise decir. Actualizaré la respuesta. –

Cuestiones relacionadas