Mejores prácticas de SVN: trabajar en equipo

98

Estoy comenzando con SVN. Conozco los comandos básicos y entiendo los principios básicos. Me preguntaba si alguien tiene algún consejo o mejores prácticas para trabajar con Subversion en un entorno de equipo.

Puedo ver el beneficio de agregar mensajes razonablemente detallados al confirmar el código, pero ¿hay otras cosas que debería tener en cuenta?

Gracias por todas las excelentes respuestas, han ayudado mucho.

codeinthehole
fuente

Respuestas:

76

Fomenta las confirmaciones frecuentes. Los compañeros de equipo nuevos en el control de versiones pueden sentir que necesitan mantener el código fuera del repositorio hasta que "funcione correctamente". Enseñe a todos a comprometerse temprano y a menudo para encontrar problemas lo antes posible. En lugar de guardar el código hasta que funcione, proponga que sus compañeros de equipo creen ramas para funciones que podrían romper el tronco. Eso lleva a ...

Establezca una práctica de ramificación y etiquetado. Además de las ramas para las funciones, anime a sus compañeros de equipo a usar las ramas para corregir errores importantes. Etiquete las correcciones de errores importantes al principio y al final del trabajo. Mantenga etiquetas (y posiblemente sucursales) para versiones de producción / control de calidad.

Establezca una política para el maletero y cúmplala. Un ejemplo podría ser, "el tronco siempre debe compilarse sin errores". o "el tronco siempre debe pasar todas las pruebas unitarias". Cualquier trabajo que aún no pueda cumplir con los estándares de troncal debe realizarse en una sucursal.

Gordon Wilson
fuente
1
ramificar y fusionar es algo complicado en SVN. Otros VCS lo manejan mucho mejor, pero yo nunca recomendaría un proceso con muchas ramas para SVN.
Branan
7
@Branan INCORRECTO. es porque no sabe cómo usar el control de fuente correctamente. Cuando se ramifica, se espera que como un buen desarrollador haga su trabajo y ACTUALICE su rama desde el tronco y combine los últimos cambios del tronco a su rama DIARIAMENTE o varias veces al día (su elección) para que al final no lo haga ha fusionado el infierno que se ha acumulado. Tengo al menos 4-5 sucursales en funcionamiento todo el tiempo localmente en mi PC y NUNCA es esta pesadilla de la que la gente habla porque lo estoy haciendo bien ... actualizándolo a menudo para tener los cambios que la gente está registrando en el tronco y trabajando y agregando código en relación con
PositiveGuy
66

No confirme cambios de formato con cambios de código

Si desea reestructurar el espacio en blanco de un archivo gigante ( Control+ K+ D), está bien. Confirme el cambio de formato por separado del cambio lógico real. Lo mismo ocurre si desea mover funciones en archivos. Confirme el movimiento por separado de la edición real.

Tom Ritter
fuente
2
así que edito un archivo todo el día, y ahora es el momento de enviarlo, ¿cómo separo el formato?
Dustin Getz
23
Si va a hacer cambios de formato con el código existente, hágalo primero, confirme y luego agregue el nuevo código / edite el código. O agregue / edite primero, confirme, luego haga el cambio de formato. De esta manera, la diferencia en la adición / edición realmente tiene sentido y no dice simplemente "¡todo es diferente ahora!"
lc.
1
+1. Los cambios extraños aumentan el esfuerzo que se necesita para revisar los cambios pertinentes. También hace que sea más difícil fusionar / portar cambios (es decir, una rama diferente).
Ates Goral
2
Si bien esta es una buena práctica a seguir, no creo que nadie pueda hacer cumplir esto. Jason tiene razón, que un buen desarrollador se dará cuenta de que puede ignorar los espacios en blanco con una buena herramienta de diferenciación (una está integrada en el SVN de tortuga) para filtrar el ruido.
Ken Sykora
1
Esto se puede aplicar mediante revisiones de código y educación a los miembros del equipo. No creo que deba ser la carga del revisor separar los cambios lógicos de los cambios de código. Debería ser responsabilidad del implementador.
Márquez
43

Uno de los conceptos clave que siempre sigo es el de realizar juntos los cambios de código relacionados . El corolario es no realizar cambios de código no relacionados en la misma confirmación . Esto significa que no corrija 2 errores en una confirmación (a menos que sea la misma solución) y no cometa la mitad de una corrección de error en cada una de las 2 confirmaciones. Además, si necesito agregar alguna mejora nueva o algo a una parte no relacionada del sistema que luego necesito para algún otro trabajo, realizo la mejora por separado (y primero). La idea es que cualquier cambio que cualquiera pueda querer tener por sí solo (o revertir por sí solo) debería ser una confirmación separada. Le ahorrará toneladas de dolores de cabeza cuando llegue el momento de hacer fusiones o revertir funciones rotas.

rmeador
fuente
4
+1 a esto. Parece un gran dolor cuando te comprometes. Pero un repositorio lleno de confirmaciones atómicas no tiene precio cuando se revisa el código antiguo.
Gordon Wilson
2
¿No es para eso para lo que sirve una rama de características? ... hacer tantas confirmaciones como sea necesario, en la rama de características, luego, cuando esté listo, fusionarla con el tronco ... las reversiones solo significan eliminar la confirmación fusionada. +1 para mantener juntos el código relacionado ...
farinspace
16

Ya se han mencionado muchas cosas, y aquí hay algunas más:

  1. Si tiene archivos que no desea en el control de fuente (por ejemplo, configuración, archivos compilados, etc.), agréguelos a la lista de ignorados . De esta manera, observa los archivos que olvida agregar porque siempre espera una lista vacía de archivos que se muestran como desconocidos para SVN.

  2. Agregue un evento de confirmación posterior que enviaría un correo electrónico a la lista de correo de su desarrollador (o uno específico para este objetivo) relacionado con el cambio comprometido e idealmente el parche para él.

  3. Integre con su rastreador de errores para que las referencias a confirmaciones aparezcan en las solicitudes de errores / funciones con enlaces a las diferencias. Los rastreadores de errores como MantisBT admiten esto.

  4. Considere la posibilidad de realizar una integración con integración continua (por ejemplo, CruiseControl.NET ), NAnt for Build y NUnit / VS para pruebas unitarias. De esta manera, una vez que un usuario registra el código o en un intervalo programado, el código se compila, se ejecutan pruebas unitarias y el desarrollador recibe comentarios sobre el proceso. Esto también alertaría al resto del equipo si el repositorio está roto (es decir, no se construye).

vboctor
fuente
La práctica que usamos es que todos los archivos de configuración han cambiado de extensión como config.php.config o algo así, de esta manera mantenemos nuestros archivos de configuración en el servidor, pero cada miembro del equipo tiene el suyo. Cuando algo grandes cambios en el archivo de configuración de lo que hacen copia versión SVN forma ...
zidane
15

Bueno, lo básico:

  • Cree etiquetas antes de iniciar el control de calidad en una versión
  • Cree etiquetas antes de cambios riesgosos (es decir, grandes refactores)
  • Cree ramas para las versiones publicadas para congelar el código.
  • Asegúrese de que la gente sepa actualizar antes de comenzar a trabajar en un fragmento de código y actualice una vez más antes de confirmarlo.
  • SVN permite múltiples desprotecciones del mismo archivo por diferentes usuarios. Asegúrese de que todos resuelvan cualquier conflicto que pueda surgir.
  • Nunca use la misma cuenta SVN para más de un usuario. Pueden resultar cosas terribles.
Monje eléctrico
fuente
7
Hago lo contrario con mis ramas y etiquetas. Las ramas son para horquillas del tronco, que eventualmente se fusionan con el tronco. Las etiquetas son para congelar el código.
steve_c
1
Las ramas son copias que pueden cambiar. Las etiquetas son copias que NO deben cambiar. svnbook.red-bean.com/en/1.2/svn.branchmerge.tags.html
matpie
Hago algo similar. Etiqueto y ramifico cuando publico el código para QA o producción. De esta manera, tenemos un marcador de solo lectura, así como una rama para abordar las correcciones de errores para esa versión que no afectarán el desarrollo de nuevas funciones que puedan tener lugar en el tronco.
JamesEggers
Svn también permite múltiples desprotecciones de la misma carpeta para el mismo usuario. Entonces, si encuentra que necesita hacer un cambio que no está relacionado con su trabajo actual (es decir, un cliente que solicita una solución de emergencia o encuentra un error completamente no relacionado por casualidad), realice la compra nuevamente y corríjalo por separado.
PMF
Se deben utilizar "etiquetas" para congelar el código. Si intenta cambiar la rama "etiqueta", su cliente SVN incluso le advierte.
Danijel
12

Las respuestas que da la gente son geniales. Mucho de esto se resume en el documento de usuario de svn para conocer las mejores prácticas para SVN .
Repetir:

  1. Configure la estructura de su repositorio (debe tener la raíz del proyecto con el tronco, las ramas y las etiquetas debajo)
  2. Elija su política de re-ramificación (sucursales privadas, sucursales por hito / lanzamiento / error, etc.) y apéguese a ella; recomendaría más sucursales en lugar de menos, pero no es necesario que haya sucursales privadas
  3. Elija su política de reetiquetado: cuantas más etiquetas, mejor, pero lo más importante es decidir las convenciones de nomenclatura de sus etiquetas.
  4. Elija su política para volver a comprometerse con el tronco: mantenga el tronco lo más "limpio" posible, debería poder liberarse en cualquier momento
hromanko
fuente
Esa es una buena práctica bastante antigua, por lo que no creo que CollabNet los recomiende más. ¿Hay nuevas mejores prácticas disponibles? El que mencionaste se remonta a SVN 1.0
mliebelt
1
@mliebelt - Actualicé el enlace a la versión de apache. Independientemente de la edad, las ideas de elegir su estructura de repositorio, sus políticas de ramificación, sus políticas de etiquetado y sus políticas de compromiso troncal, junto con las muy buenas respuestas anteriores, siguen siendo sólidas.
hromanko
Sin embargo, esa descripción de "Sistema de ramificación cuando sea necesario" es bastante loca. Suena como una receta para un rodaje en la oficina.
naught101
10

Me gustaría resumir las mejores prácticas que sigo:

  1. No comprometa binarios . Debe haber un repositorio separado para binarios, como Nexus , Ivy o Artifactory .
  2. Debe haber una estructura de repositorio . Personalmente utilizo la siguiente estructura de repositorio:

    /trunk
    /tags
        /builds
            /PA
            /A
            /B
        /releases
            /AR
            /BR
            /RC
            /ST
    /branches
        /experimental
        /maintenance
            /versions
            /platforms
        /releases
    
  3. Utilice una lista específica de tipos de ramas . Mi lista es la siguiente: experimental , mantenimiento , versiones , plataformas , lanzamientos .
  4. Utilice tipos específicos de etiquetas : PA(pre-alfa), A(alfa), B(beta), AR(lanzamiento alfa), BR(lanzamiento beta), RC(candidato de lanzamiento), ST(estable).
  5. Minimice la necesidad de fusionarse . Debería haber reglas sobre cuándo la fusión es posible / recomendada y cuándo no.
  6. Numeración de versiones . Debe haber un enfoque de numeración de versiones establecido al que atenerse. Por lo general, se describe en un documento como Plan de gestión de la configuración de software, es parte de la documentación del proyecto de alto nivel. Personalmente, utilizo un enfoque complejo de numeración de versiones. Según este enfoque, las versiones tienen los siguientes patrones: Nxx (ramas de mantenimiento / soporte), NMx (rama de lanzamiento), NxK (compilación), NMK (lanzamiento).
  7. Comprometerse con la mayor frecuencia posible . Si tiende a ser difícil (por ejemplo, cuando se deben realizar demasiados cambios para implementar la característica e incluso compilar código), se deben usar ramas experimentales.
  8. Trunk debe contener el último desarrollo . Por ejemplo, cuando hay una elección de dónde desarrollar una nueva versión principal ( Nxx ) de la aplicación, en el tronco o en la rama, la decisión siempre debe tomarse a favor del tronco . La versión anterior debe ramificarse en la rama de mantenimiento / soporte . Asume que hay una clara distinción entre las versiones principales y sus detalles (arquitectura, compatibilidad) surgen lo antes posible .
  9. Estricta política de "no romper la compilación" en las ramas de lanzamiento . Mientras tanto, no debería ser necesariamente estricto para el tronco , siempre que tenga un desarrollo experimental o una base de código que necesite resolver problemas de fusión.
  10. Utilice svn: externals . Permitirá modularizar su proyecto, establecer un procedimiento transparente de gestión de versiones, dividir y conquistar diferentes funcionalidades.
  11. Utilice el seguimiento de problemas . Podrá señalar la referencia del problema dentro del mensaje de confirmación.
  12. Desactive los mensajes de confirmación vacíos . Se podría hacer usando ganchos de confirmación previa.
  13. Defina qué ramas desea integrar continuamente . Por ejemplo, prefiero usar la integración continua para las ramas troncales , de mantenimiento y de liberación .
  14. Establecer una política de integración continua para diferentes tipos de sucursales. Como señalé anteriormente, las reglas más estrictas de "no romper la construcción" se aplican a las ramas de liberación , mientras que las ramas troncales y de mantenimiento pueden romperse a veces. También hay una diferencia entre la lista de inspecciones ejecutadas en el tronco / mantenimiento y las ramas de liberación .

Puede encontrar un esquema de mis mejores prácticas de subversión en forma de diagrama que ilustra los principios fundamentales del enfoque de gestión de configuración de software que utilizo.

alternar
fuente
Entonces, ¿cómo trabajas en equipo? ¿Diferentes personas usan diferentes ramas? ¿Cómo evitar conflictos? Tu respuesta no cubre el trabajo en equipo :(
DataGreed
2
P: ¿Cómo evitar conflictos? R: Minimice la necesidad de fusionar , Trunk debe contener el último desarrollo . Comprometerse con la mayor frecuencia posible. P: ¿Diferentes personas usan diferentes ramas? R: Cada rama puede ser utilizada por una o más personas. También es importante diferenciar los tipos de ramas: experimental, de mantenimiento y de lanzamiento, ayuda a evitar conflictos. P: Tu respuesta no cubre el trabajo en equipo R: Puede parecer a primera vista. Usar el control de versiones automáticamente significa trabajo en equipo. Describí el conjunto de reglas (como reglas de camino) que ayudan a colaborar de manera aún más efectiva
altern
7

Una cosa que he encontrado muy útil es la propiedad svn: external , lo que significa que puede hacer referencia a directorios de otros repositorios al suyo. Ofrece formas realmente agradables de organizar su código y datos. Algunos ejemplos son:

  1. Si tiene repositorios separados para codificar diferentes módulos / bibliotecas y referencia en los que está utilizando. Esto significa que puede tener un meta repositorio para cada ejecutable. Si se trata de un pequeño ejecutable que solo usa unos pocos módulos, no necesitará verificar todo el árbol. Un efecto de esto es que obtiene números de revisión SVN por módulo.
  2. Agregar grandes datos binarios, como versiones compiladas de bibliotecas al repositorio de código, generalmente se considera un mal hábito, pero puede ser realmente conveniente. Si solo agrega todas las versiones de todas las bibliotecas que usa a un repositorio diferente, puede obtener lo mejor de dos mundos. Haces referencia en las versiones de las bibliotecas que usas en tu repositorio de código. Cuando revise su repositorio de código, obtendrá tanto el código como los binarios. Sin embargo, los binarios se almacenan en un gran repositorio del que no es necesario realizar una copia de seguridad tan rigurosamente como su código fuente y el repositorio de código fuente permanece pequeño y solo contiene texto.
Laserallan
fuente
1
Me gusta el punto 2. Ya que puede especificar un número de revisión o no cuando usa svn: external, esto le permitirá "fijar" algunas bibliotecas a versiones específicas mientras permite que otras "rastreen" la última versión.
j_random_hacker
El uso de "svn: external" es una de las funciones más poderosas, y yo diría que la mayoría de las funciones básicas de SVN. Es un deber.
Danijel
5

Utilice la integración con su software de seguimiento de errores. Si usa Bugzilla , puede configurarlo para que si su comentario comience con "Error XXXX", su comentario SVN se agregue automáticamente como un comentario al error dado, incluido un enlace a su interfaz web SVN a esa revisión.

Joseph Bui
fuente
Trac tiene una buena integración de svn para el seguimiento de errores, además de la línea de tiempo, diferencias de confirmación, wiki, etc.
Doug Currie
Jira también rastrea las confirmaciones relacionadas con los problemas
Dan Soap
4

Conozca las herramientas y convenciones de ramificación y fusión de SVN.

La mejor manera de trabajar con otros miembros del equipo es dividir el trabajo en funciones / correcciones de desarrollo completas, luego trabajar en cambios individuales, cada uno en una rama. Luego, vuelva a fusionar los cambios con la rama / troncal de la línea principal cuando estén completados / listos / aprobados para fusionarse.

De esta manera, las personas pueden trabajar hacia un objetivo común (ya sea en la misma rama o en ramas separadas) sin chocar con otros cambios.

Su kilometraje puede variar, y esto puede ser excesivo para solo dos personas.

Scott Markwell
fuente
3

Lo hace mucho más fácil si usa buenas herramientas que se integran bien con SVN. Estos facilitan ver qué se ha cambiado y luego confirmar todos o parte de sus cambios y actualizar con frecuencia su copia de trabajo a la última versión en SVN.

Recomiendo Tortoise SVN (si usa Windows) y Visual SVN (si usa VS).

También vea si puede configurarlo para recibir un correo electrónico o una notificación similar cada vez que se confirma un cambio (generalmente también incluye el mensaje de confirmación y una lista de archivos modificados). Servicios como CVSDude ofrecen esto. Encuentro útil saber que se ha realizado una actualización y luego tener una idea de lo que contiene esa actualización antes de actualizar mi copia de trabajo.

Lawrence Johnston
fuente
3

Además de las políticas de ramificación et al. (donde un tamaño definitivamente no sirve para todos), debe tener buenas confirmaciones:

  • El compromiso debe relacionarse con una sola pieza de trabajo si es posible; una corrección de errores, una nueva característica: debería haber algo de 'lógica' en los cambios que cometió
  • La confirmación debe tener un comentario descriptivo que le ayudará a ubicarla navegando por el historial del repositorio. La mayoría de las personas sugieren escribir una sola oración al principio que describa todo el compromiso y una descripción más detallada a continuación.
  • Si es posible, debe vincular la confirmación a su sistema de seguimiento de errores si es posible. Trac, Redmine y col. le permite crear enlaces de errores a confirmaciones y viceversa, lo que resulta muy útil.
alex
fuente
2

Consulte con su equipo acerca de sus cambios, o al menos observe la diferencia con mucho cuidado, antes de solucionar cualquier conflicto de fusión. Pídales que revisen el código combinado ellos mismos para asegurarse de que sus adiciones no se pierdan en la combinación.

MetroidFan2002
fuente
2

Una cosa que he visto que reduce las confirmaciones rotas es tener buenos scripts de confirmación previa. Por ejemplo, puede ejecutar cualquier prueba unitaria antes de que se confirme el cambio. Esto hará que los compromisos sean un poco lentos, pero ahorrarás tiempo al evitar pisar los dedos de los pies de alguien y tener que disculparte. Por supuesto, esto se vuelve mucho más difícil de administrar cuando tienes un gran equipo de desarrollo y compromisos muy frecuentes.

usuario52137
fuente
+1 para scripts de confirmación previa. Gran idea. Me pregunto si hay alguna manera de hacer que git te dé un golpe en la mano si intentas comprometerte sin ejecutarlo.
naught101
2

Uno de los ejemplos de integración con el seguimiento de errores y la aplicación de la política de confirmación podrían ser los scripts de enlace pre / post-compromiso svn de Trac , que pueden rechazar la confirmación si el mensaje de confirmación no hace referencia a ningún ticket en el seguimiento de errores y agrega comentarios a los existentes. tickets basados ​​en el contenido del mensaje (es decir, el mensaje de confirmación puede contener algo como "Arreglos # 1, # 2 y # 8", donde # 1, # 2, # 8 son los números de tickets).

dolzenko
fuente
2

Mejores prácticas para usar SVN :

  1. Cuando llegó por primera vez a la oficina y abrió su proyecto Eclipse , el primer paso que debe realizar es actualizar su proyecto.

  2. Después de actualizar, comience su trabajo. Cuando termine su codificación, verifíquela correctamente, si su aplicación se ejecuta correctamente sin ninguna excepción. Una vez que esté seguro de que su código funciona bien, es hora de confirmar el código.

Nota: Mientras confirma el código, no se comprometa directamente. Realice una sincronización con el servidor y verifique cuáles son todas las necesidades que deben confirmarse. Nota: No confirme la carpeta completa una vez. Porque es posible que haya realizado algunos cambios en el archivo según sus necesidades o que haya eliminado algunos archivos en su sistema local. Pero la configuración es diferente en el servidor. Así que verifique los archivos individualmente y confirme el código.

  1. No comprometa / actualice archivos de conflicto directamente.

  2. ¿Cuándo anular y actualizar?

    Cuando esté bastante seguro de que no necesita ninguno de sus cambios locales y desea actualizar la copia del servidor por completo. Tenga en cuenta que una vez que realice la anulación y la actualización, no obtendrá ninguno de los cambios locales.

    Nota: No guarde el proyecto sin actualizarlo durante más de un día. Además, no guarde el código sin comprometerse durante muchos días.

  3. Comunique quiénes están trabajando en el mismo componente y analice los cambios que han realizado todos los días.

  4. No confirme las propiedades y el archivo de configuración a menos que haya alguna razón. Porque la configuración será diferente en un servidor y en la nube.

  5. No comprometa las carpetas de destino en SVN, solo el código fuente y las carpetas de recursos deben mantenerse en un repositorio de SVN.

  6. Cuando pierda su código, ¡no se asuste! Puede recuperar la copia anterior del historial de SVN.

  7. No guarde el proyecto en varios lugares de su disco. Compruébelo en un solo lugar y trabaje con él.


Ravi Kumar
fuente
1

SVN en sí mismo es un buen comienzo y algunos de los otros carteles han ofrecido excelentes sugerencias sobre las mejores prácticas.

Lo único que agregaría es que debería conectar SVN con CruiseControl o TeamCity para impulsar un proceso de integración continua. Esto enviará correos electrónicos de compilación y permitirá que todos sepan cuándo alguien rompió la compilación.

Será muy revelador desde el principio quién está siguiendo su proceso y quién no. Puede generar cierta fricción, pero su equipo estará mejor a largo plazo.

Karthik Hariharan
fuente
1
De acuerdo, CruiseControl ha salvado a mi equipo en numerosas ocasiones.
Gordon Wilson
1
  • Comentario preciso para cada compromiso

  • ¡No rompa la construcción (principal)!

  • Comprometerse tan pronto como cambie una unidad lógica

  • Evite usar Subversion como herramienta de respaldo

  • Un poco de ramificación / fusión como sea posible

.

Se pueden encontrar más detalles en las mejores prácticas de SVN .

Cobarde anónimo
fuente
0

¿Trabajar DEV en sucursales?

  1. Compromisos frecuentes con su rama
  2. Compromisos discretos / modulares para su rama ( consulte aquí )
  3. Actualizar / fusionar desde el tronco con frecuencia. No te sientes en tu rama sin volver a basar

Tronco comunitario

  1. Siempre debe construir / trabajar
  2. Un problema por confirmación ( vea nuevamente aquí ) Principalmente para que usted u otros puedan retroceder las cosas una a la vez
  3. No combine los cambios de refactorización / espacios en blanco con cambios lógicos. Tus compañeros de equipo tendrán dificultades para extraer lo que realmente hiciste de un compromiso

Recuerde que cuanto más incrementales, modulares, discretos y concisos haga sus confirmaciones, más fácil será para usted (o probablemente para otros):

  • Retroceder gradualmente los cambios
  • Date cuenta visualmente de lo que hiciste sin tener que examinar toneladas de espacios en blanco y cambios de nombre de variable.
  • Los mensajes de confirmación significan más cuando la relación entre el trabajo realizado y la longitud del mensaje es menor.
Wilbur Whateley
fuente
0

Use esto para la plantilla de comentarios:

[tarea / historia xxx] [menor / mayor] [comentario] [comentario de seguimiento] [URL del error]

John Griffiths
fuente