¿Cómo 'svn agregar' todos los archivos no versionados a SVN?


177

Estoy buscando una buena manera de 'agregar 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 origen. Me gustaría tener un script corto que pueda ejecutar para agregarlos automáticamente, en lugar de revisarlos y agregarlos uno por uno.

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


1
@Saul Esta pregunta es claramente anterior a la que vinculaste, así que no veo cómo puede ser un duplicado. En todo caso, la otra pregunta es el duplicado.
Neutrino

Cygwin es una opción. Te da el poder de bash en cualquier entorno de Windows. He sido usuario por más de 10 años con problemas muy menores.
user151841

Respuestas:


346

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

Gran consejo! Una observación: mi Eclipse agrega automáticamente nuevos archivos a la lista de ignorados. Puede ser una cuestión de configuración, pero de todos modos: existe la --no-ignoreopción que ayuda.

Después de esto, puede comprometerse:

svn commit -m 'Adding a file'

14
Gran consejo Mucho mejor que usar el estado svn. "svn add --force" parece ser suficiente.
Nombre

1
¿Hay una manera fácil de configurar esto en una macro acortada (es decir, como puede hacerlo con git)? Además, ¿sería posible actualizar esta respuesta para que explique cada bit?
MrDuk

2
@MrDuk: Acortado: alias magic="svn add --force * --auto-props --parents --depth infinity -q"- Explicado:svn help add
Ronan

17
El problema es que esto agrega archivos ignorados ¿correcto? No deseable.
ladieu

1
@Nombre: debe ponerlo *al final, de lo contrario no funcionaría (al menos para mí)
vsync

72

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

8
Esto utiliza herramientas UNIX (grep, sed, bash) que el OP dijo que no tenía.
Naaff 01 de

3
También podría desenterrar sed y grep en Windows si realmente quisiera.
Sam Saffron

1
Lo siento por ese voto positivo en el comentario de cygwin, no fue intencional (y no puedo deshacerlo). De hecho, creo que Cygwin es lo más feo que puedes tener en Windows. Todavía puede usar findtr en lugar de grep, que funcionará al menos desde Windows 2000 sin instalar nada adicional.
Joey el


2
Estoy con mbyrne215; Esta respuesta me ayudó más que la solución del OP, así que la votaré. Funciona perfectamente en OS X 10.6.7.
Asbjørn Ulsberg

37

Lo que funciona es esto:

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

Agrega el contenido de subdirectorios.

No agrega archivos ignorados.

Enumera qué archivos se agregaron.

El punto en el comando indica el directorio actual, esto puede reemplazarse por un nombre de directorio o ruta específicos si desea agregar un directorio diferente al actual.


En realidad, eso debería ser .\*o si svn root está en un directorio diferente stuff\svn_root\*.
Nux

No te sigo. Los comandos para SVN se ejecutan en el contexto de la ruta desde la cual se ejecutan, esto es de esperar. "svn add. \ *" solo no se repite e imprime una carga de spam de advertencia, lo que hace imposible ver lo que se agregó realmente. "svn add. \ * --force" se repite pero también imprime "svn: argumento de omisión: E200025: '. \. svn' termina en un nombre reservado". Entonces eso parece peor que mi solución original.
Neutrino

Estaba señalando que probablemente no tenga una unidad C completa en SVN ;-), por lo que debe agregar una ruta. Y desde mi ruta de prueba de especificación, ya stuff\svn_rootque no agrega archivos en subdirectorios (por ejemplo, en stuff\svn_root\already_in_svn\not_in_svn.txt). De ahí la estrella al final.
Nux

@Nux Solo ahora, después de todos estos años, finalmente veo lo que estaba obteniendo :) En el comando, el punto es la ruta que especifica el directorio actual. Naturalmente, se puede suministrar cualquier alternativa válida.
Neutrino

Esta es la respuesta correcta. No estoy seguro de cómo una solución que incluye agregar archivos ignorados ocupa el primer lugar. @Neutrino, sugiera eliminar su comentario a Joey que ya no aparece en esta página, y también agregue una línea que refuerce que su sugerencia NO agrega archivos ignorados
b_levitt

35

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 aquellos que llegan a esta pregunta y preguntan por lo mismo (ya que el título no incluye la palabra clave "VENTANAS").

Nota (febrero de 2015): como comentó "bdrx", el comando anterior podría simplificarse aún más de esta manera:

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

1
Agradable, compacto, conciso, también se presta bastante bien a la extensión. Gracias.
Norman H

1
Excelente. También es fácil de expandir, modificar para eliminar, etc.
Drewid

Perfecto para lo que necesitaba. ¡Gracias!
Jeff

2
¿Por qué la gente siempre grep y luego se dirige a awk? Awk puede hacer coincidencia de patrones: awk '/^[?]/{print $2}'; No es necesario el proceso grep adicional.
bdrx

1
@bdrx: ¿Quizás porque grep se asocia comúnmente con la coincidencia de patrones? En mi caso personal, tengo mucha más experiencia con grep que con awk. No sabía que podía hacer tales cosas en awk, así que comenzaré a usar awk más en mis scripts. ¡Gracias!
lepe

5
svn add --force .

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


5

Este método debe manejar nombres de archivos 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:

  • Lista todos los archivos modificados.
  • 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.
  • Canalice 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 establece {} para usar como marcador de posición para que podamos colocar los "caracteres alrededor del nombre de archivo utilizado por 'svn añadir'.

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


Esto supone Linux o similar (por ejemplo, MinGW o Cygwin ). El OP declaró: "Mi servidor ejecuta Windows Server 2003, por lo que una solución Unix no funcionará".
Peter Mortensen

4

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


Con gran repositorio TortoiseSVN se cuelga. Esto me hizo buscar alternativas de línea de comando :-)
Upendra


3

Utilizar:

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

1
O puede usar cortar para hacer el trabajo de grep: svn status | cut -d ? -f 2 -s | xargs svn add
Eric3

Esto supone Linux o similar (por ejemplo, MinGW o Cygwin ). El OP declaró: "Mi servidor ejecuta Windows Server 2003, por lo que una solución Unix no funcionará".
Peter Mortensen

3

Yo siempre uso:

Copiar pegar

svn st | grep "^\?" | awk "{print \$2}" | xargs svn add $1

1
Op explicity afirma que una solución de Unix no le sirve de nada.
Neutrino

Esto supone Linux o similar (por ejemplo, MinGW o Cygwin ). El OP declaró: "Mi servidor ejecuta Windows Server 2003, por lo que una solución Unix no funcionará".
Peter Mortensen

3

Dado que esta publicación está etiquetada como Windows, pensé en encontrar 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 haya agregado en mi repositorio cuando comienzo el proceso de confirmación.

El problema con muchas de las respuestas es que enumerarán los archivos no versionados que deben ignorarse según mi lista de ignorados en TortoiseSVN .

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

Script de gancho de tortuga:

"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

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

Dentro de esta implementación, tendrás problemas en el caso de que tus 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 simples:

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

2

Si usa Linux o usa Cygwin o MinGW en Windows, puede usar soluciones tipo bash como las siguientes. En contraste con otros similares presentados aquí, este tiene 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

¿Para qué es esto? CMD? ¿Intento? Parece Bash (o un caparazón similar). En ese caso, supone Linux o similar (por ejemplo, MinGW o Cygwin ). El OP declaró: "Mi servidor ejecuta Windows Server 2003, por lo que una solución Unix no funcionará".
Peter Mortensen

Gracias, tienes razón, cuando estoy en Windows uso Cygwin con Bash. Sin embargo, la declaración "Mi servidor está ejecutando Windows Server 2003, por lo que una solución Unix no funcionará". Es falso. Tal vez no quiera usar Cygwin o MinGW, pero no se expresó de esa manera. Reformulé la respuesta.
ajaest

1

Después de pasar un tiempo tratando de descubrir cómo agregar recursivamente 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í va una explicación.

El primer comando agrega todos los directorios. El segundo comando agrega solo los archivos de acuerdo con los patrones especificados.

Déjame darte 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 carácter.
  • 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óstrofes.
  • DO: significa que lo que viene después en el comando es lo que se ejecutará para cada directorio
  • svn add --depth = empty: es el comando SVN deseado que se ejecutará; la definición de profundidad significa agregar solo el directorio y no los archivos dentro de ellos.
  • "% F": así es como se usa la variable definida anteriormente.

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


0

Puedes usar el comando

svn add * force--

o

svn add <directory/file name>

Si sus archivos / directorios no se agregan recursivamente. Entonces revisa esto.

La adición recursiva es propiedad predeterminada . Puedes ver en el libro SVN .

El problema puede estar en su lista de ignorados o en sus propiedades globales.

Tengo solución rastreador de problemas de google

Verifique las propiedades globales para ignorar la estrella (*)

  • Haga clic derecho en su repositorio en la ventana. Seleccionar TortoiseSVN > Properties.
  • A ver si no tienes una propiedad svn:global-ignores with a value of *
  • Si tiene una propiedad con star(*), ignorará la adición recursiva. Entonces elimine esta propiedad.

Verifique el patrón de ignorar global para ignorar la estrella (*)

  • Haga clic derecho en su repositorio en la ventana. Seleccionar TortoiseSVN > Settings > General.
  • Vea en Global Ignore Pattern, si no ha establecido la estrella (*) allí.
  • Si lo encontró star(*), elimine esta propiedad.

Este chico también explicó por qué esta propiedad agregó en mi proyecto.

La forma más parecida en que llegó allí es que alguien hizo clic derecho en un archivo sin ninguna extensión y seleccionó TortoiseSVN -> SVN Ignore -> * (recursivamente), y luego lo confirmó.

Puede consultar el registro para ver quién cometió el cambio de propiedad, averiguar qué estaban tratando de hacer y pedirles que sean más cuidadosos en el futuro. :)


0

Puede ingresar el siguiente comando en Linux:

find ./ -name "*." | xargs svn add

0

Como especificó Windows, donde awk & sed no son estándar:

for /f "tokens=1*" %e in ('svn status^|findstr "^\?"') do svn add "%f"

o en un archivo por lotes:

for /f "tokens=1*" %%e in ('svn status^|findstr "^\?"') do svn add "%%f"

0

Esta es la forma perezosa y peligrosa de sincronizar un directorio con SVN que incluye nuevos archivos:

svn rm --keep-local dir
svn add dir

Aunque esto puede funcionar en un apuro, también puede tener serias consecuencias. Por ejemplo, SVN a menudo perderá el rastro del historial de un archivo.

La forma ideal de sincronizar un directorio sería poder diferenciar y luego usar svn patch, sin embargo, esto se desvía de los formatos en el comando diff y el comando svn diff comparará las diferencias del directorio de trabajo en lugar de las diferencias en el nivel del sistema de archivos.


-1

Creo que he hecho algo similar con:

svn add . --recursive

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


2
solo una actualización para su memoria: svn 1.4 y 1.5 no son compatibles --recursivo como parámetro para svn add :)
Ludwig Wensauer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.