tortoise subir revertir repositorio puerto proyecto por ignorar eliminar defecto crear configuracion con como cambios archivos archivo svn build-automation

subir - svn eliminar archivos del repositorio



Eliminar automáticamente los archivos no versionados de Subversion (30)

¿Alguien sabe una forma de eliminar recursivamente todos los archivos en una copia de trabajo que no están bajo control de versión? (Necesito esto para obtener resultados más confiables en mi compilación automática de VMware).


¿No puedes exportar a una nueva ubicación y construir desde allí?


Agregué esto a mi perfil de Windows PowerShell

function svnclean { svn status | foreach { if($_.StartsWith("?")) { Remove-Item $_.substring(8) -Verbose } } }


Como todos los demás lo están haciendo ...

svn status | grep ^? | awk ''{print $2}'' | sed ''s/^/.///g'' | xargs rm -R


El snipet del código C # anterior no funcionaba para mí. Tengo un cliente svn tortuga y las líneas tienen un formato ligeramente diferente. Aquí está el mismo snipet de código que el anterior, solo reescrito para funcionar y usar regex.

/// <summary> /// Cleans up svn folder by removing non committed files and folders. /// </summary> void CleanSvnFolder( string folder ) { Directory.SetCurrentDirectory(folder); var psi = new ProcessStartInfo("svn.exe", "status --non-interactive"); psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.WorkingDirectory = folder; psi.CreateNoWindow = true; using (var process = Process.Start(psi)) { string line = process.StandardOutput.ReadLine(); while (line != null) { var m = Regex.Match(line, "//? +(.*)"); if( m.Groups.Count >= 2 ) { string relativePath = m.Groups[1].ToString(); string path = Path.Combine(folder, relativePath); if (Directory.Exists(path)) { Directory.Delete(path, true); } else if (File.Exists(path)) { File.Delete(path); } } line = process.StandardOutput.ReadLine(); } } } //CleanSvnFolder


He intentado la versión de Seth Reno a partir de esta respuesta, pero no funcionó para mí. He tenido 8 caracteres antes de nombre de archivo, no 9 utilizados en cut -c9- .

Así que esta es mi versión con sed lugar de cut :

svn status | grep ^/? | sed -e ''s//?/s*//g'' | xargs -d //n rm -r


Línea de comandos de Linux:

svn status --no-ignore | egrep ''^[?I]'' | cut -c9- | xargs -d //n rm -r

O bien, si algunos de sus archivos son propiedad de root:

svn status --no-ignore | egrep ''^[?I]'' | cut -c9- | sudo xargs -d //n rm -r

Esto se basa en la respuesta de Ken. (La respuesta de Ken se salta los archivos ignorados, mi respuesta los elimina).


Me encontré con esta página mientras buscaba hacer lo mismo, aunque no para una compilación automatizada.

Después de mirar un poco más, descubrí el '' Menú de contexto ampliado '' en TortoiseSVN. Mantenga presionada la tecla Mayús y haga clic derecho en la copia de trabajo. Ahora hay opciones adicionales en el menú TortoiseSVN que incluyen " Eliminar elementos no versionados ... ".

Aunque tal vez no sea aplicable para esta pregunta específica (es decir, en el contexto de una versión automatizada), pensé que podría ser útil para otros que buscan hacer lo mismo.


Me encontré con svn-clean en mi máquina RH5. Está ubicado en / usr / bin / svn-clean

svn-clean


Mi conversión de C # de la secuencia de comandos de Thomas Watnedals Python:

Console.WriteLine("SVN cleaning directory {0}", directory); Directory.SetCurrentDirectory(directory); var psi = new ProcessStartInfo("svn.exe", "status --non-interactive"); psi.UseShellExecute = false; psi.RedirectStandardOutput = true; psi.WorkingDirectory = directory; using (var process = Process.Start(psi)) { string line = process.StandardOutput.ReadLine(); while (line != null) { if (line.Length > 7) { if (line[0] == ''?'') { string relativePath = line.Substring(7); Console.WriteLine(relativePath); string path = Path.Combine(directory, relativePath); if (Directory.Exists(path)) { Directory.Delete(path, true); } else if (File.Exists(path)) { File.Delete(path); } } } line = process.StandardOutput.ReadLine(); } }


No pude hacer nada de lo anterior para trabajar sin dependencias adicionales que no quería tener que agregar a mi sistema de compilación automatizado en win32. Así que armé los siguientes comandos Ant: tenga en cuenta que estos requieren que Ant-contrib JAR esté instalado (estaba usando la versión 1.0b3, la última, con Ant 1.7.0).

Tenga en cuenta que esto borra todos los archivos no versionados sin previo aviso.

<taskdef resource="net/sf/antcontrib/antcontrib.properties"/> <taskdef name="for" classname="net.sf.antcontrib.logic.ForTask" /> <macrodef name="svnExecToProperty"> <attribute name="params" /> <attribute name="outputProperty" /> <sequential> <echo message="Executing Subversion command:" /> <echo message=" svn @{params}" /> <exec executable="cmd.exe" failonerror="true" outputproperty="@{outputProperty}"> <arg line="/c svn @{params}" /> </exec> </sequential> </macrodef> <!-- Deletes all unversioned files without warning from the basedir and all subfolders --> <target name="!deleteAllUnversionedFiles"> <svnExecToProperty params="status &quot;${basedir}&quot;" outputProperty="status" /> <echo message="Deleting any unversioned files:" /> <for list="${status}" param="p" delimiter="&#x0a;" trim="true"> <sequential> <if> <matches pattern="/?/s+.*" string="@{p}" /> <then> <propertyregex property="f" override="true" input="@{p}" regexp="/?/s+(.*)" select="/1" /> <delete file="${f}" failonerror="true" /> </then> </if> </sequential> </for> <echo message="Done." /> </target>

Para una carpeta diferente, cambie la referencia ${basedir} .


Para las personas en Windows que desean evitar el uso de cualquier herramienta, excepto los comandos standart MS-Dos, aquí una solución:

FOR / F "tokens = 1 * delims ="% G IN (''svn st ^ | findstr "^?"'') DO rd / s / q "% H"

FOR / F "tokens = 1 * delims ="% G IN (''svn st ^ | findstr "^?"'') DO del / s / f / q "% H"

  • svn st mostrará el estado de cada archivo y carpeta en la copia de trabajo
  • findstr buscará cada línea que comience por ''?'', lo que significa que el archivo / carpeta no está versionado
  • FOR usará como delimitadores y tomará los tokens después del 1er (el 1er es% G, el resto es% H) De esta manera estamos extrayendo el archivo / carpeta del resultado del comando svn st.
  • rd eliminará las carpetas, del eliminará los archivos.

Para las personas que les gusta hacer esto con perl en lugar de python, Unix shell, java, etc. Por este medio, un pequeño script perl que también hace el jib.

Nota: Esto también elimina todos los directorios no versionados

#!perl use strict; sub main() { my @unversioned_list = `svn status`; foreach my $line (@unversioned_list) { chomp($line); #print "STAT: $line/n"; if ($line =~/^/?/s*(.*)$/) { #print "Must remove $1/n"; unlink($1); rmdir($1); } } } main();


Si está en la línea de comandos de Windows,

for /f "tokens=2*" %i in (''svn status ^| find "?"'') do del %i

Versión mejorada:

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

Si usa esto en un archivo por lotes, necesita duplicar el % :

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


Si está utilizando svn tortuga hay un comando oculto para hacer esto. Mantenga presionada la tecla Mayús mientras hace clic derecho en una carpeta para abrir el menú contextual en Windows Explorer. Obtendrá el comando "Eliminar elementos no versionados".

vea la parte inferior de esta page para más detalles, o la captura de pantalla debajo de la cual se destacan las características extendidas con las estrellas verdes, y la de interés con el rectángulo amarillo ...


Si no desea escribir ningún código, svn2.exe de svn2svn hace esto, también hay un artículo sobre cómo se implementa. Las carpetas y archivos eliminados se guardan en la papelera de reciclaje.

Ejecute "svn2.exe sync [path]".


Si te gusta CoolShell:

svn status --no-ignore | ?{$_.SubString(0,1).Equals("?")} | foreach { remove-item -Path (join-Path ./ $_.Replace("?","").Trim()) -WhatIf }

Elimine el indicador -WhatIf para que el comando realmente realice las eliminaciones. De lo contrario, solo generará lo que haría si se ejecuta sin el -WhatIf.


Si tiene TortoiseSVN en su ruta y se encuentra en el directorio correcto:

TortoiseProc.exe /command:cleanup /path:"%CD%" /delunversioned /delignored /nodlg /noui

Las opciones se describen en la ayuda de TortoiseSVN para /command:cleanup :

Use / noui para evitar que el cuadro de diálogo de resultados aparezca, ya sea para indicar que se terminó la limpieza o para mostrar un mensaje de error). / noprogressui también desactiva el diálogo de progreso. / nodlg deshabilita mostrar el cuadro de diálogo de limpieza donde el usuario puede elegir qué se debe hacer exactamente en la limpieza. Las acciones disponibles se pueden especificar con las opciones / limpieza para la limpieza del estado, / revertir, / delunversioned, / delignored, / refreshshell y / externals.


Solo hazlo en unix-shell con:

rm -rf `svn st . | grep "^?" | cut -f2-9 -d'' ''`


Solución de Windows puro cmd / bat:

@echo off svn cleanup . svn revert -R . For /f "tokens=1,2" %%A in (''svn status --no-ignore'') Do ( If [%%A]==[?] ( Call :UniDelete %%B ) Else If [%%A]==[I] Call :UniDelete %%B ) svn update . goto :eof :UniDelete delete file/dir if "%1"=="%~nx0" goto :eof IF EXIST "%1/*" ( RD /S /Q "%1" ) Else ( If EXIST "%1" DEL /S /F /Q "%1" ) goto :eof


También encontré y usé lo siguiente: svn status --no-ignore | awk ''/ ^? / {print $ 2}'' | xargs rm


También podría contribuir con otra opción

svn status | awk ''{if($2 !~ /(config|/.ini)/ && !system("test -e /"" $2 "/"")) {print $2; system("rm -Rf /"" $2 "/"");}}''

El /(config|.ini)/ es para mis propios fines.

Y podría ser una buena idea agregar --no-ignore al comando svn


Una manera limpia de hacer esto en PERL sería:

#!/usr/bin/perl use IO::CaptureOutput ''capture_exec'' my $command = sprintf ("svn status --no-ignore | grep ''^?'' | sed -n ''s/^/?//p''"); my ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command ); my @listOfFiles = split ( '' '', $stdout ); foreach my $file ( @listOfFiles ) { # foreach () $command = sprintf ("rm -rf %s", $file); ( $stdout, $stderr, $success, $exit_code ) = capture_exec ( $command ); } # foreach ()


Usé ~ 3 horas para generar esto. Tardaría 5 minutos hacerlo en Unix. El problema principal fue: espacios con nombres para carpetas Win, imposibilidad de editar %% iy problemas con la definición de vars en Win cmd loop.

setlocal enabledelayedexpansion for /f "skip=1 tokens=2* delims==" %%i in (''svn status --no-ignore --xml ^| findstr /r "path"'') do ( @set j=%%i @rd /s /q !j:~0,-1! )




Yo uso este script de python para hacer eso:

import os import re def removeall(path): if not os.path.isdir(path): os.remove(path) return files=os.listdir(path) for x in files: fullpath=os.path.join(path, x) if os.path.isfile(fullpath): os.remove(fullpath) elif os.path.isdir(fullpath): removeall(fullpath) os.rmdir(path) unversionedRex = re.compile(''^ ?[/?ID] *[1-9 ]*[a-zA-Z]* +(.*)'') for l in os.popen(''svn status --no-ignore -v'').readlines(): match = unversionedRex.match(l) if match: removeall(match.group(1))

Parece hacer el trabajo bastante bien.


esto funciona para mí en bash:

svn status | egrep ''^/?'' | cut -c8- | xargs rm

Seth Reno es mejor:

svn status | grep ^/? | cut -c9- | xargs -d //n rm -r

Maneja carpetas y espacios no versionados en nombres de archivo

Según los comentarios a continuación, esto solo funciona en archivos que la subversión no conoce (estado =?). Todo lo que la subversión conozca (incluidos los archivos / carpetas ignorados) no se eliminará.

Si está utilizando subversion 1.9 o superior, puede simplemente usar el comando svn cleanup con las opciones --remove-unversioned y --remove-ignored


Agregaría esto como un comentario a la respuesta de Thomas Watnedal , pero aún no puedo.

Un problema menor (que no afectará a Windows) es que solo busca archivos o directorios. Para Unix como los sistemas donde los enlaces simbólicos pueden estar presentes, es necesario cambiar la línea:

if os.path.isfile(fullpath):

a

if os.path.isfile(fullpath) or os.path.islink(fullpath):

para eliminar enlaces.

Para mí, cambiar la última línea if match: removeall(match.group(1)) en

if match: print "Removing " + match.group(1) removeall(match.group(1))

para que muestre lo que está eliminando también fue útil.

Dependiendo del caso de uso, la parte ?[/?ID] de la expresión regular puede ser mejor que ?[/?I] , ya que la D también elimina los archivos eliminados, que estaban bajo el control de la versión. Quiero usar esto para construir una carpeta limpia y registrada, por lo que no debería haber archivos en el estado D


svn st --no-ignore | grep ''^[?I]'' | sed ''s/^[?I] *//'' | xargs -r -d ''/n'' rm -r

Este es un comando de shell unix para eliminar todos los archivos que no están bajo control de subversión.

Notas:

  • el st en svn st es un alias incorporado para el status , es decir, el comando es equivalente al svn status
  • --no-ignore también incluye archivos que no son de repositorio en la salida de estado; de lo contrario, se ignora mediante mecanismos como .cvsignore etc., ya que el objetivo es tener un punto de inicio limpio para las compilaciones, este cambio es obligatorio
  • grep filtra el resultado de manera que solo quedan archivos desconocidos para la subversión, ¿comienzan las líneas ? archivos de lista desconocidos para la subversión que serían ignorados sin la --no-ignore
  • el prefijo hasta el nombre de archivo es eliminar vía sed
  • el comando xargs se instruye a través de -r para no ejecutar rm , cuando la lista de argumentos estaría vacía
  • la opción -d ''/n'' le dice a xargs que use una nueva línea como delimitador, por lo que el comando también funciona para nombres de archivos con espacios
  • rm -r se usa en caso de que los directorios completos (que no son parte del repositorio) deban eliminarse

svn status --no-ignore | awk ''/^[I/?]/ {system("echo rm -r " $2)}''

elimina el eco si eso es seguro de lo que quieres hacer.