2008-09-22 17 views
8

El concepto de subversión de bifurcación parece centrarse en la creación de una bifurcación [no] estable de todo el repositorio para el desarrollo. ¿Hay un mecanismo para crear ramas de archivos individuales?¿Cómo ramifico un archivo individual en SVN?

Para un caso de uso, piense en un archivo de encabezado común (* .h) que tenga múltiples implementaciones de fuente específicas de plataforma (* .c). Este tipo de rama es permanente. Todas estas ramas verían un desarrollo continuo con una fusión cruzada ocasional. Esto está en agudo contraste con el desarrollo inestable/ramas de liberación estables que generalmente tienen una vida útil finita.

I no desea ramificar todo el repositorio (barato o no), ya que crearía una cantidad excesiva de mantenimiento para fusionar continuamente entre el tronco y todas las ramas. En este momento estoy usando ClearCase, que tiene un concepto diferente de ramificación que hace que esto sea más fácil. Me han pedido que considere la transición a SVN, pero esta diferencia de paradigma es importante. Estoy mucho más preocupado por poder crear versiones alternativas para archivos individuales que por cosas como cortar una rama de lanzamiento estable.

+1

Usted nota en otro comentario que este no es realmente su caso de uso.No se sorprenda cuando las respuestas intenten resolver este caso de uso en lugar de su versión real. – wnoise

Respuesta

3

Tristemente, creo que la verdadera respuesta aquí es que ClearCase maneja esta situación mucho mejor que Subversion. Con subversión, tiene que bifurcar todo, pero ClearCase permite un tipo de idea de "rama diferida", lo que significa que solo un determinado grupo de archivos está ramificado, el resto aún sigue el tronco (o la rama que especifique).

Las otras soluciones proporcionadas aquí realmente no funcionan como usted desea, solo están copiando el archivo en una ruta diferente. Ahora tienes que hacer cosas raras para usar ese archivo.

Erm, lo siento. Esa no fue realmente una muy buena respuesta. Pero no hay una buena solución para esto con Subversion. Su modelo es branch y merge.

Editar: Bien, expandiendo lo que dijo crashmstr. Usted puede hacer esto:

svn cp $REP/trunk/file.h $REP/branched_files/file.h 
svn co $REP/trunk 
svn switch $REP/branched_files/file.h file.h 

Pero ¡wow !, es propenso a errores. Siempre que haga un svn st verá esto:

svn st 
    S file.h 

Un poco ruidoso.Y cuando quiera ramificar algunos archivos o módulos dentro de un repositorio fuente grande, comenzará a ser muy complicado.

En realidad, probablemente haya un proyecto decente aquí para simular algo así como los archivos de ClearCase con propiedades svn y el cambio, escribiendo un envoltorio alrededor del cliente svn estándar de pantano para hacer frente a todo el desastre.

1

Una "rama" Subversion es solo una copia de algo en su repositorio. Entonces, si quisiera ramificar un archivo, simplemente lo haría:

svn copy myfile.c myfile_branch.c 
+0

Lo malinterpretas. Quiero un archivo con dos ramas alternativas (o "historiales" en alguna otra terminología de sistemas CM). No quiero dos archivos relacionados pero distintos. –

+0

En Svn, una rama es solo una copia (de un archivo o directorio). Entonces, al ramificar solo un archivo, puede mantenerlo en el mismo directorio (pero con un nombre diferente como se sugiere aquí), o ponerlo en un directorio diferente ... Dudo que Subversion ofrezca otras opciones. La historia es ramificada. – Alexander

+0

Me doy cuenta de que una rama es solo una copia. (La insistencia de SVN en exponer eso en la interfaz de usuario es uno de mis mayores problemas con eso). Estoy de acuerdo con que la respuesta sea "no puedes hacer eso". Prefiero no usar un martillo para manejar un tornillo. Solo estoy tratando de aprender qué herramientas están disponibles. –

0

Una rama en SVN es solo una copia. Creo que para hacerlo de la manera en que lo desea, debe tener cada versión del archivo en un directorio separado en el repositorio, y verifíquelo en su carpeta de origen. ES DECIR. tratar ese archivo como un proyecto separado.

9

No es necesario ramificar todo el repositorio. Puede hacer ramas de carpetas en su proyecto (como una carpeta de inclusión). Como otros han notado, también puede hacer una "copia" de solo un archivo. Una vez que tenga una copia de un archivo o carpeta, "cambie" al archivo o carpeta bifurcada para trabajar en la versión de la sucursal.

Si crea una ramas separadas carpeta en el repositorio, puede copiar los archivos ramificados allí a través de comandos del lado del servidor:

 
svn copy svn://server/project/header.h svn://server/branched_files/header.h 

entonces se podría cambiar el archivo a utilizar la ruta branches_files repositorio

+0

Eso es bastante incómodo, pero podría ser viable. Gracias por el aporte. –

1

No creo que tenga mucho sentido ramificar un solo archivo? No hay forma de probarlo con el código troncal?

Podría tomar un parche en su lugar si desea deshacer los cambios y aplicarlos más adelante.

+0

Es una tarea legítima si tiene muchos cambios que hacer en ese archivo y quiere estar a salvo, sin embargo, aislar a sus compañeros de equipo de su trabajo en curso. –

+0

Hay un punto. He actualizado la pregunta para intentar aclarar el caso de uso. –

+0

Otro ejemplo: nuestro proyecto está pasando de una versión de un complemento a otra. Esto requiere cambios en las propiedades del eclipse. Los mantenemos informados. ¿Cómo hacemos para que la gente ejecute la versión anterior y la nueva del complemento al mismo tiempo? Sería bueno si una rama fuera la misma que otra excepto los archivos de configuración de eclipse que deben ser diferentes. –

1

¿Estás seguro de que realmente necesitas esta característica en tu VCS?

¿Por qué no utilizar el preprocesador C y #ifdef el código que no necesita? O cualquier herramienta similar.

algo como:

// foo.h: 
void Foo(); 

// foo_win32.c 
#ifdef _WIN32 
void Foo() 
{ 
    ... 
} 
#endif 

// foo_linux.c 
#ifdef _GNUC 
void Foo() 
{ 
    ... 
} 
#endif 

A veces, si no se ajusta a derecho, entonces no es la solución correcta.

+0

Sí, quiero esto como una característica del VCS. El caso de uso era solo un ejemplo fácil de entender. Mi situación real es algo más compleja y no se limita a C. Hasta ahora "no es la solución correcta" para mí no ha significado SVN. –

+0

Entiendo. Buena suerte ! – rlerallut

3

Así es como entiendo su problema. Usted tiene el siguiente árbol:

 
time.h 
time.c 

y hay que rechazarla para múltiples arquitecturas:

 
time.h is comon 
time.c (for x386), time.c (for ia64), time.c (for alpha),... 

También en su VCS actual se puede hacer esto mediante la creación de tantas ramas de time.c según sea necesario y cuando finaliza la compra de los archivos desde el VCS, verifica automáticamente la última hora.h desde la línea troncal común y la última hora.c desde la sucursal en la que está trabajando.

El problema que le preocupa es que si utiliza SVN al verificar una sucursal, deberá fusionar time.h de trunk con mucha frecuencia o arriesgarse a trabajar en un archivo anterior (en comparación con el trunk) esa cantidad de por encima no es aceptable para usted.

Dependiendo de la estructura de su código fuente, puede haber una solución. imagine que tiene

 
/
/headers/ 
/headers/test.h 
/source/ 
/source/test.c 

Posteriormente, se podría ramificarse /, y utilizar la función de svn:externals vincular sus cabeceras a la cabeza del tronco. Solo funciona en directorios y tiene algunas limitaciones con respecto a comprometerse con test.h (debe ir al directorio del encabezado para que funcione) pero podría funcionar.

0

Una rama en Subversion es exactamente de lo que estás hablando. Todos los archivos son una copia exacta del tronco, con la excepción de los que usted cambia. Esta es la metodología de "copia barata" de la que hablamos en el Libro SVN. La única advertencia es la necesidad de fusionar el tronco en la rama de vez en cuando para asegurar que los cambios realizados allí se reflejen en la rama. Por supuesto, si esos cambios no son deseados, no es necesario que se produzcan fusiones de troncales y ramas.

Una manera fácil de fusionar los cambios troncales automáticamente (que simula el paradigma Clear Case) sería utilizar un script de enlace precompilado para fusionar los cambios del tronco antes de la confirmación (de hecho, esta es siempre una buena estrategia para evitar la deriva del código).

Cuestiones relacionadas