Pregunta ¿Cómo elimino un archivo de la versión de svn sin eliminarlo de cada copia de trabajo?


Mi situación es que un grupo de archivos se registran en svn, que son muy molestos tener bajo control de fuente (específicamente un log4j.properties archivo), y me gustaría eliminarlos del control de versiones. Ya sé cómo eliminar un archivo del control de la versión svn en mi propia copia de trabajo local, como en esta pregunta y éste, pero eso no es exactamente lo que estoy buscando.

El problema es que una vez que elimino el archivo con svn rm --keep-local, cuando todos los demás usuarios extraen del repositorio sus copias locales de log4j.properties desaparecerá y sus entornos colapsarán. Lo que quiero hacer es eliminar el archivo del control de versiones en el repositorio, pero también hacerlo para que cuando todos los demás extraigan del repositorio sea como si hubieran usado --keep-local en sus propias máquinas, de modo que la copia existente de su log4j.properties el archivo se queda pero se convierte en no versionado.

¿Es esto posible? Sospecho que es una característica que svn simplemente no tiene.


32
2017-10-27 20:16


origen


Respuestas:


Si realmente tienes muchos de esos archivos, puedes matar dos pájaros de un tiro utilizando un svndumpfilter operación. La idea es hacer un volcado del repositorio en el servidor, filtrar los archivos que no desea conservar y cargar el resultado en un nuevo repositorio. Luego pones el nuevo en lugar del anterior.

Esto debe hacerse con cuidado, cuando los usuarios no acceden obviamente al repositorio. Pero en realidad eliminará los archivos (interesantes cuando sean grandes) en lugar de mantenerlos en la historia. Como efecto secundario, la próxima vez que un usuario haga una actualización, estos archivos serán ignorados como si nunca estuvieran en el repositorio. Tuvimos que hacer eso varias veces para eliminar los binarios que no tenían su lugar allí.

Enlace a la documentación relacionada.

Ejemplo simple (el comando ofrece más flexibilidad por supuesto):

svnadmin create repos_new
svnadmin dump repos | svndumpfilter exclude trunk/log4j.properties | svnadmin load repos_new

Como toca el repositorio en el servidor, quiero enfatizar una vez más que debe tomar precauciones (mantener su antiguo repositorio). Para archivos no tan molestos, el método propuesto por Don es menos drástico y preferible

Para evitar este tipo de situación, puede establecer el correspondiente svn:ignore En las propiedades de los directorios, también puede alentar a las personas a utilizar omisiones globales (tienen que configurarse en cada cliente desafortunadamente), o incluso usar los scripts de gancho para rechazar categorías de archivos de manera preventiva.


8
2017-10-27 20:53



El secreto es asegurarse de que esté en la lista de ignorar antes de usted comete la eliminación. Si lo hace en ese orden, la eliminación no se propagará a las copias de trabajo de los demás.

Todavía estamos usando svn 1.4 por lo que la opción --keep-local no está disponible. Pero puede lograr lo mismo borrándolo usando una ruta del servidor y un mensaje de confirmación de m.

Entonces, en mi ejemplo, cometí accidentalmente un directorio llamado nbproject. Ahí es donde se establece el proyecto de desarrollador para el IDE que usamos (NetBeans). ¡No quería borrar eso de las copias de trabajo de todos o perderían todas sus configuraciones! Pero esto hizo el truco. A partir del directorio principal:

$ cd trunk
$ svn propedit svn:ignore .

trae $ EDITOR

agrega nbproject en su propia línea y guarda

$ svn commit -m 'Ignore nbproject'
$ svn rm https://.../trunk/nbproject -m 'Remove nbproject from svn'

14
2018-01-10 21:12



Lo que suelo hacer en situaciones similares es cambiar el nombre de la copia del repositorio de log4j.properties a log4j.properties.template o log4j.properties.defaulty añado log4j.properties al svn:ignore lista. Entonces, cada usuario tiene que copiar ese archivo a log4j.properties en su copia de trabajo. Para hacerlo un poco más amigable, puede poner un cheque en su script de compilación que imprime un mensaje recordatorio si no encuentra la copia local.


7
2017-10-27 20:21



svn delete --keep-local <PATH> 

va a hacer


-2
2018-06-21 23:34