¿Cómo puedo ‘svn agregar’ todos los archivos no versionados a SVN?

Estoy buscando una buena manera de ‘svn add’ automáticamente todos los archivos no versionados en una copia de trabajo a mi repository SVN.

Tengo un servidor en vivo que puede crear algunos archivos que deberían estar bajo control de fuente. Me gustaría tener un script corto que pueda ejecutar para agregarlos automáticamente, en lugar de ir y agregarlos uno a la vez.

Mi servidor ejecuta Windows Server 2003, por lo que una solución Unix no funcionará.

    svn add --force * --auto-props --parents --depth infinity -q

    ¡Un gran consejo! Un comentario: mi Eclipse agrega nuevos archivos a la lista de ignorar automáticamente. Puede ser una cuestión de configuración, pero de todos modos: existe la --no-ignore que ayuda.

    Después de esto, puedes comprometer:

     svn commit -m 'Adding a file' 

    Esta es una pregunta diferente a la mía, pero hay una respuesta que pertenece a esta pregunta:

     svn status | grep '?' | sed 's/^.* /svn add /' | bash 

    Lo que funciona es esto:

     c:\work\repo1>svn add . --force 

    Agrega el contenido de los subdirectorios.

    No agrega archivos ignorados.

    Enumera qué archivos se agregaron.

    El punto en el comando indica el directorio actual, este puede ser reemplazado por un nombre de directorio específico o ruta si desea agregar un directorio diferente al actual.

    Esto funcionó para mí:

     svn add `svn status . | grep "^?" | awk '{print $2}'` 

    ( Fuente )

    Como ya resolvió su problema para Windows, esta es una solución UNIX (siguiendo a Sam). Agregué aquí porque creo que todavía es útil para quienes llegan a esta pregunta pidiendo lo mismo (ya que el título no incluye la palabra clave “WINDOWS”).

    Nota (feb, 2015): Tal como lo comentó “bdrx”, el comando anterior podría simplificarse aún más de esta manera:

      svn add `svn status . | awk '/^[?]/{print $2}'` 

    Este método debe manejar nombres de archivo que tengan cualquier número / combinación de espacios en ellos …

     svn status /home/websites/website1 | grep -Z "^?" | sed s/^?// | sed s/[[:space:]]*// | xargs -i svn add \"{}\" 

    Aquí hay una explicación de lo que hace ese comando:

    • Listar todos los archivos cambiados.
    • Limite esta lista a líneas con ‘?’ al principio – es decir, nuevos archivos.
    • Eliminar el ‘?’ personaje al comienzo de la línea.
    • Elimina los espacios al comienzo de la línea.
    • Pipe los nombres de archivo en xargs para ejecutar el svn add varias veces.

    Use el argumento -i para xargs para manejar la posibilidad de importar nombres de archivos con espacios en ‘svn add’ – básicamente, -i sets {} para usar como marcador de posición para que podamos poner los “caracteres alrededor del nombre de archivo utilizado por ‘svn añadir’.

    Una ventaja de este método es que debe manejar nombres de archivo con espacios en ellos.

    TortoiseSVN tiene esta capacidad incorporada, si está dispuesto a usar una solución que no sea de línea de comando. Simplemente haga clic derecho en la carpeta de nivel superior y seleccione Agregar

     svn add --force . 

    Esto agregará cualquier archivo no versionado en el directorio actual y todos los directorios secundarios versionados.

    Esto está documentado en svn book y es el más simple y funciona perfecto para mí

     svn add * --force 

    http://svnbook.red-bean.com/en/1.6/svn.ref.svn.c.add.html

    Utilizar:

     svn st | grep ? | cut -d? -f2 | xargs svn add 

    Como esta publicación está etiquetada como Windows, pensé que encontraría una solución para Windows. Quería automatizar el proceso, e hice un archivo bat. Me resistí a hacer un console.exe en C #.

    Quería agregar cualquier archivo o carpeta que no se agregue en mi repository cuando empiece el proceso de confirmación.

    El problema con muchas de las respuestas es que listarán archivos no versionados que deberían ignorarse según mi lista de ignorar en TortoiseSVN .

    Aquí está mi configuración de gancho y archivo por lotes, que hace eso

    Guión de Tortoise Hook:

     "start_commit_hook". (where I checkout) working copy path = C:\Projects command line: C:\windows\system32\cmd.exe /c C:\Tools\SVN\svnadd.bat (X) Wait for the script to finish (X) (Optional) Hide script while running (X) Always execute the script 

    svnadd.bat

     @echo off rem Iterates each line result from the command which lists files/folders rem not added to source control while respecting the ignore list. FOR /F "delims==" %%G IN ('svn status ^| findstr "^?"') DO call :DoSVNAdd "%%G" goto end :DoSVNAdd set addPath=%1 rem Remove line prefix formatting from svn status command output as well as rem quotes from the G call (as required for long folder names). Then rem place quotes back around the path for the SVN add call. set addPath="%addPath:~9,-1%" svn add %addPath% :end 

    Yo siempre uso:

    Copiar pegar

     svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1 
     for /f "usebackq tokens=2*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%i %%j" 

    Dentro de esta implementación, tendrá problemas en el caso de que sus carpetas / nombres de archivo tengan más de un espacio como el siguiente:

     "C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Sega Mega 2" "C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\One space" "C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Double space" "C:\PROJECTS\BACKUP_MGs_via_SVN\TEST-MG-10\data\destinations\Single" 

    tales casos están cubiertos por simple:

     for /f "usebackq tokens=1*" %%i in (`svn status ^| findstr /r "^\?"`) do svn add "%%j" 

    Si usa Linux o usa Cygwin o MinGW en Windows, puede usar soluciones tipo bash como la siguiente. En contraste con otros similares presentados aquí, este toma en cuenta los espacios de nombre de archivo:

     svn status| grep ^? | while read line ; do svn add "`echo $line|cut --complement -c 1,2`" ;done 

    Después de pasar algún tiempo tratando de descubrir cómo recursivamente agregar solo algunos de los archivos, pensé que sería válido compartir lo que funcionó para mí:

     FOR /F %F IN ('dir /s /b /a:d') DO svn add --depth=empty "%F" FOR /F %F IN ('dir /s /b /a *.cs *.csproj *.rpt *.xsd *.resx *.ico *.sql') DO svn add "%F" 

    Aquí hay alguna explicación.

    El primer comando agrega todos los directorios. El segundo comando agrega solo los archivos según los patrones especificados.

    Déjame dar más detalles:

    • PARA: ya sabes, el control de bucle.
    • / F: significa tomar los archivos y directorios (no estoy seguro exactamente).
    • % F: es una variable; asumirá el valor de cada uno de los archivos enumerados a la vez; podría tener otro nombre de un solo nombre.
    • IN: no hay necesidad de explicar, ¿verdad?
    • (‘dir / s / b / a: d’): el comando DOS que listará los directorios; en mi caso / s es recursivo, / b es tomar solo la ruta completa, / a: d significa solo el directorio; cámbielo como desee manteniendo el paréntesis y los apóstrofos.
    • DO: significa que lo que sigue en el comando es lo que se ejecutará para cada directorio
    • svn add –depth = empty: es el comando SVN que se desea ejecutar; la definición de profundidad significa agregar solo el directorio y no los archivos dentro de ellos.
    • “% F”: así es como usas la variable definida anteriormente.

    En el segundo comando, las únicas diferencias son el comando dir y el comando svn, creo que es bastante claro.

    Creo que hice algo similar con:

     svn add . --recursive 

    pero no estoy seguro si mi memoria es correcta ;-p