2009-10-13 12 views
11

La situación es que he pasado algún tiempo jugando con algún código experimental. Ahora quiero mover parte de ese código - alrededor de 500 líneas - a otro archivo, pero no quiero perder el historial, como lo haría si hago un simple editor de texto cortado y pegado.Usando Subversion, ¿cómo puedo cortar de un archivo y pegarlo a otro historial de preservación?

Tan cerca como sé cómo separar el código del archivo original - svn copy, luego elimine material no deseado de ambas copias. Pero no sé cómo anexar esa copia parcial a un archivo existente, manteniendo el historial de ambos.

La razón por la que esto es importante es básicamente que el código es solo algo muy especializado, para ayudar a implementar algunas funciones de nivel superior. No quiero que contamine espacios de nombres globales, así que lo quiero todo en el único archivo donde se usará y se envolverá en un espacio de nombre anónimo.

Me doy cuenta de que esto suena como la fusión de una rama en el maletero. Lo que pasa es que no hay rama. El código experimental no comenzó como una copia de nada, es solo un montón de código iniciado desde cero. El archivo del que quiero cortar y el que quiero pegar son archivos completamente independientes.

Uso principalmente TortoiseSVN, pero también tengo instalada la subversión de línea de comandos.

Respuesta

16

Puede combinar todas las revisiones (o revisiones específicas) de un archivo en otro como éste

svn merge sourcefile targetfile -r 0:HEAD 

Al principio pensé que habría que utilizar la opción --ignore-ancestry (ya que ambos archivos no comparten ninguna común historia) pero aparentemente esto no es necesario. Probé con svn 1.6.3.

Por supuesto, es muy probable que obtenga muchos marcadores de conflictos en el resultado de la fusión. Puede ser más fácil hacer la fusión a mano (una fusión de copiar y pegar como dices), y luego ejecutar el comando de fusión anterior con --record-only para contarle a subversión sobre esto.

Después de la combinación, targetfile tendrá una propiedad svn:mergeinfo que indica qué confirmaciones se han fusionado en sourcefile. Cuando examine el registro de targetfile, puede ver el historial de ambos archivos utilizando la opción --use-merge-history. TortoiseSVN tiene la misma característica en forma de una casilla de verificación en el formulario de registro.

+0

Eso es bastante inteligente. –

+0

Sospecho que esto no hará exactamente lo que quiero, pero estoy convencido de que es lo mejor que obtendré (menos el hack de svn ducking), así que estoy de acuerdo. Gracias. – Steve314

+0

Tendrás el registro de confirmación, pero todas las líneas de tus cambios tendrán el mismo marcador de revisión en la 'culpa'. –

1

Si desea copiar en un nuevo archivo y eliminar el antiguo archivo:

svn mv 

Si desea duplicar en un nuevo archivo:

svn copy 

Si tanto el archivo ya existe:

# copy/paste with a text editor 

puede eliminar un archivo de una mantener su historia con:

svn del 

Con SVN no puede mantener el rastro de la historia de una combinación de dos archivos. Puede fusionarlo a mano y mantener un seguimiento en el mensaje de confirmación.

+0

Ninguno de estos me dan un archivo que contiene el texto (y la historia) a partir de dos archivos de origen. La copia/pegado del editor de texto conserva el historial de ambos en el repositorio, es verdadero, nunca se borra nada, pero el historial del archivo que se cortó se desprende del archivo que pegó. En términos de TortoiseSVN, Blame culpará a todo en el corte y pegado, y no a las personas que tomaron las decisiones de codificación. – Steve314

+0

Son todas las herramientas que le ofrece Subversion. Probablemente deberías usar algunos DVCS. TortoiseMercurial existe para usuarios de Windows. – Natim

+0

Por cierto, no entiendo exactamente lo que espera al fusionar el historial de dos archivos. no tiene sentido. ¿Qué tipo de retroceso tienes en mente? Puede agregar un comentario al comienzo de su archivo para decir que es una fusión de este archivo y otro en la revisión rXXXX – Natim

4

No creo que pueda preservar la historia en la forma que está describiendo. SVN realiza un seguimiento del historial archivado por archivo y no realiza un seguimiento de dos archivos separados que se combinan en la misma línea de código.

Si comenzó con dos archivos separados y luego los combina en un tercero, se conservará el historial de ambos. Si combina uno con el otro, el historial de uno de ellos se "perderá" en el sentido de que no podrá volver a vincular el historial del archivo "eliminado" simplemente mirando el historial.

Supongo que lo que podría hacer es en el mensaje de compromiso, solo tenga en cuenta que el contenido del otro archivo se combinó y luego confirme la eliminación en el mismo compromiso.

+0

Tenía la sensación de que esa era la respuesta. Aún no se acepta en la improbabilidad. Tendré otra mirada mañana por las dudas. – Steve314

-1

¿No puede dejar el código en su propio archivo (después de recortar las partes que no desea conservar) e incluir este archivo en su archivo fuente "real"?

// file foo.cpp: 
... 
namespace { 
# include "util_code.inc" 
} 

En realidad, no ortodoxa, pero debería funcionar ...

+0

No me gusta ese estilo de uso de #include. Se acostumbró a las convenciones this-is-the-spec, that-is-the-body en otros idiomas hace mucho tiempo. Esa es probablemente la razón por la cual la idea ni siquiera se me ocurrió, pero supongo que no es tan grave, dada una gama de opciones imperfectas. Demasiado tarde esta vez, pero siempre hay una próxima vez. – Steve314

+0

Gracias. Por supuesto, no recomendaría un uso general de tales directivas #include. Pero yo las utilizo para incluir código generado: #define THE_CLASS MiClase # include method_bodies.inc con method_bodies.inc con este aspecto: vacío THE_CLASS :: generatedMethod() {} ... Pude así generar algunos, pero no todos, los métodos de una clase sin que el generador supiera el nombre de la clase. –

Cuestiones relacionadas