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
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 "${basedir}""
outputProperty="status" />
<echo message="Deleting any unversioned files:" />
<for list="${status}" param="p" delimiter="
" 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!
)
Usando TortoiseSVN: * haga clic derecho en la carpeta de copia de trabajo, mientras mantiene presionada la tecla Mayús * seleccione "eliminar elementos no versionados"
Ver: svn-clean
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
ensvn st
es un alias incorporado para elstatus
, es decir, el comando es equivalente alsvn 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 ejecutarrm
, cuando la lista de argumentos estaría vacía - la opción
-d ''/n''
le dice axargs
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.