2009-08-02 11 views
49

A veces incluyo muchos archivos en directorios diferentes en mi proyecto. Por ahora estoy agregando todos los archivos uno por uno a mi proyecto antes de la confirmación. ¿Hay algún comando de terminal Linux que pueda agregar todos los archivos no versionados a Subversion?Agregue todos los archivos no versionados a Subversion usando un comando de Linux

¿Y si quiero agregar todos los archivos excepto uno o dos?

+0

posible duplicado de [Cómo usar "svn add" recursivamente en la consola de Windows?] (http://stackoverflow.com/questions/4302888/how-to-use-svn-add-recursively-in-windows-console) – Saul

Respuesta

9

De forma predeterminada, el comando svn add es recursivo. Solo apúntelo al directorio de nivel superior de su proyecto y debería agregar cualquier archivo que aún no esté allí.

Es posible que desee incluir la opción --force, aunque tenga en cuenta que esto también agregará archivos que de lo contrario se excluyen debido a svn: ignorar (si no utiliza svn: ignorar, entonces no tendrá ningún cuestiones).

26

añade cualquier archivo con un signo de interrogación al lado de él, sin dejar de exclusión de archivos ignorados:

svn status | grep -v "^.[ \t]*\..*" | grep "^?" | awk '{print $2}' | xargs svn add 
svn commit 

http://codesnippets.joyent.com/posts/show/45

+0

Hola James. Lamento haber desestimado tu respuesta, pero es un error. Por favor, edítalo, para poder deshacer este downvote (y este comentario también). – Guillaume

+0

No estoy seguro por qué, pero creo que su expresión regular no se preocupa por los nombres de archivos que contienen espacios ... – genuinefafa

-1

No he utilizado SVN. Pero lo siguiente debería funcionar.

svn add foo/bar.file bar/foo.file 

Esto debe añadir el archivo en el directorio bar.filefoo y foo.file existente en el directorio bar.

Y svn add foo debe agregar todos los archivos en foo al servidor. La bandera "recursiva" está configurada por defecto.

Y para agregar todos los archivos en un directorio a excepción de unos pocos (como los archivos que comienzan/finalizan con las palabras clave tmp, test, etc.), no creo que haya una manera más clara/más simple de hacerlo, y mejor escriba un script de shell que haga esto.

+4

¿Por qué debería intentar contribuir con algo que no ha usado o para el cual no puede estar seguro de que funciona? –

+0

Debo aceptar el comentario anterior. Google está nublado con "Nunca he usado X antes pero ..." Tiene que parar. – steve

76
svn add --force <directory> 

Añadir ya es recursivo. Solo tiene que forzarlo para atravesar subdirectorios versionados.

10

Este comando agregará todos los archivos sin versión enumerados en el resultado del comando svn st a la subversión.

Tenga en cuenta que no se agregará ningún nombre de archivo que contenga espacios en blanco en la salida svn stat. Además, podría ocurrir un comportamiento extraño si algún nombre de archivo contiene '?' S.

svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 | xargs svn add 

o si usted es bueno en awk:

svn st | grep ? | awk '{print $2}' | xargs svn add 

Explicación:

Paso 1:svn st comando

[[email protected] rails]$svn st 
?  app/controllers/application.rb 
M  app/views/layouts/application.html.erb 
?  config/database.yml 

Paso 2: Nos grep el archivo no-versionado con grep comando:

[[email protected] rails]$svn st | grep ? 
?  app/controllers/application.rb 
?  config/database.yml 

Paso 3: luego retire la contracción del espacio entre ? y la ruta del archivo mediante el comando tr:

[[email protected] rails]$svn st | grep ? | tr -s ' ' 
? app/controllers/application.rb 
? config/database.yml 
</pre> 

Paso 4: A continuación, seleccione la segunda columna de la salida utilizando el comando de corte:

[[email protected] rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 
app/controllers/application.rb 
config/database.yml 

Paso 5: Por último, pasando estas rutas de archivos como entrada estándar a svn add comando:

[[email protected] rails]$svn st | grep ? | tr -s ' ' | cut -d ' ' -f 2 | xargs svn add 
A  app/controllers/application.rb 
A  config/database.yml 
+0

felicitaciones por la explicación! –

0

Esta versión de los comandos anteriores se encarga del caso en el que los archivos comprometidos o las rutas de acceso a ellas contienen espacios . Sin embargo, este comando aún fallará si la ruta contiene una comilla simple.

svn st |grep ^?| cut -c9-| awk '{print "\x27"$0"\x27"}' | xargs svn add 

yo fuimos para el corte -c9- para deshacerse de los espacios iniciales y asumiendo que el comando svn st comenzará el nombre de archivo en el noveno carácter en todas las máquinas. Si no está seguro, pruebe esta parte del comando primero.

0

Este script de shell, recursivamente examina (svn status) directorios en su proyecto, eliminando los archivos faltantes y agregando nuevos archivos al repositorio. Es una especie de "almacenar en el repositorio la instantánea actual del proyecto".

if [ $# != 1 ] 
then 
    echo "usage: doSVNsnapshot.sh DIR" 
    exit 0 
fi 

ROOT=$1 

for i in `find ${ROOT} -type d \! -path "*.svn*" ` 
do 

    echo 
    echo "--------------------------" 
    (cd $i ; 
    echo $i 
    echo "--------------------------" 


    svn status | awk ' 
      /^[!]/ { system("svn rm " $2) } 
      /^[?]/ { system("svn add " $2) } 
     ' 
    ) 
    echo 

done 
1

La solución mencionada con awk '{print $2}' por desgracia no funciona si los archivos contienen espacios en blanco. En tal caso, esto funciona bien:

svn st | grep "^?" | sed 's/^?[ \t]*//g' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn add 

donde

sed 's/^?[ \t]*//g' 

elimina el signo de interrogación y caracteres vacíos desde el principio y

sed 's/^/"/g' | sed 's/$/"/g' 

encierra los nombres de archivo con comillas.

1

Un enfoque utilizando un Perlone-liner para añadir todos los archivos que se muestran con un signo de interrogación por "svn st" sería:

svn st | perl -ne 'print "$1\n" if /^\?\s+(.*)/' | xargs svn add 

Esto también se debe trabajar con los caracteres de espacio en los nombres de archivo.

21

Este intentará añadir todos los archivos - pero en realidad sólo añadir los que no están ya en SVN:

svn add --force ./* 
1

Ninguno de ustedes son totalmente correcta me paso toda una noche para solucionarlo y es funcionando correctamente en mis Jenkins:

svn status | grep -v "^.[ \t]*\..*" | grep "^?[ \t]*..*" | awk '{print $2}' | sed 's/\\/\//g' | sed 's/\(.*\)\r/"\1"/g' | xargs svn add --parents 
svn commit 
  1. estado
  2. eliminar svn
  3. encontrar? en la línea que comienza para determinar si está sin versión (modifíquelo en | grep "^? [\ t] *. * cpp" | solo agregará cpp)
  4. eliminar? (Uno de los anteriores memtion hilo el problema de awk, se puede tratar de uso tr o sed en su lugar)
  5. reemplazar bienvenida a salpicaduras Linux (opcional, necesidad cygwin) línea de
  6. encierran citando
  7. xargs de llamadas (debe agregar --parent para asegurarse de que las subcarpetas de nivel medio también se agreguen si intenta filtrar cpp o cierto patrón de archivo)
Cuestiones relacionadas