tortoise - ¿Cómo puedo ''svn agregar'' todos los archivos no versionados a SVN?
svn tutorial español (15)
Estoy buscando una buena manera de ''svn add'' automáticamente todos los archivos no versionados en una copia de trabajo a mi repositorio 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á.
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 repositorio 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
Creo que hice algo similar con:
svn add . --recursive
pero no estoy seguro si mi memoria es correcta ;-p
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.
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.
Esto está documentado en svn book y es el más simple y funciona perfecto para mí
svn add * --force
Esto funcionó para mí:
svn add `svn status . | grep "^?" | awk ''{print $2}''`
( Source )
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}''`
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.
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
Utilizar:
svn st | grep ? | cut -d? -f2 | xargs svn add
Yo siempre uso:
Copiar pegar
svn st | grep "^/?" | awk "{print /$2}" | xargs svn add $1
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 * --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''
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"
svn add --force .
Esto agregará cualquier archivo no versionado en el directorio actual y todos los directorios secundarios versionados.