Denegar la creación de la twig de una twig en svn

¿Es posible crear un enlace, negando, la capacidad de crear una twig desde una twig?
Permitiéndolo solo desde el maletero?
Si es así, ¿cómo sería?

Sí, es posible con un gancho precompromiso, pero lo lamentarás. Hay momentos en los que puede crear una twig fuera de una twig. Supongamos que tiene una solución a largo ploop para esa twig y desea crear una twig de características . En este caso, necesita hacer una bifurcación de su sucursal.

Vamos al grano de tu pregunta: ¿Cómo estás desarrollando? Demasiados sitios (es decir, más de cero) utilizan una metodología prístina troncal . La idea es que el desarrollo no se realiza en el tronco. En su lugar, crea una twig, hace todo el trabajo en la twig, luego combina esa twig en el tronco y luego crea una nueva twig para la próxima versión. Uno de los mayores problemas es que los desarrolladores olvidan fusionarse con el enlace troncal y crean una nueva bifurcación fuera del enlace troncal. Es mucho más fácil crear la siguiente twig de la twig actual.

El tronco prístino no es una buena metodología. Es complejo, es difícil hacer un desarrollo paralelo que ocurre cuando te acercas a un lanzamiento (especialmente porque no quieres crear una bifurcación de twigs). Y, no te compra nada. Se supone que Trunk es la última versión, pero obtienes la misma información de las tags.

Lo que es peor, trunk no puede decirle nada excepto la última versión (que está en HEAD ). La versión anterior en el tronco? No puedes decir. Algunos files cambiaron durante el último lanzamiento y otros no. Es por eso que usas tags. Tampoco puede get ningún historial del tronco. ¿Quién hizo ese cambio? No ves al autor del cambio. En su lugar, ves a la persona que fusionó la twig en el tronco.

Si usa una metodología de troncos prístinos, deténgase.

Si no estás haciendo la metodología prístina del tronco, me alegra oír eso. Ignora la queja anterior.

Lo que realmente desea hacer no es evitar twigs de twigs, sino limitar quién puede crear una twig y dónde pueden crear esta twig. Por ejemplo, las twigs de liberación solo deberían ser realizadas por el CM. Las twigs de funciones pueden ser creadas por los líderes del equipo. Puede usar convenciones de nomenclatura para diferenciar entre estos diferentes types de ramificación, o incluso colocarlos en directorys especiales. (Como branches/releases vs. 'twigs / otro').

Tengo un gancho precompromiso que puede ayudar en este esfuerzo. Puede limitar quién puede crear una sucursal y dónde y qué pueden llamar la sucursal.

En mi respuesta original, específicamente dije que la metodología del tronco prístino es defectuosa, no mencioné las alternativas. Hice esto a propósito porque hay bastantes metodologías. Los dos más populares se llaman desarrollo inestable troncal y de flujo .

Desarrollo basado en Stream

En esto, tiene dos flujos separados: una secuencia de integración y una secuencia de desarrollo . En la mayoría de los casos, las transmisiones generalmente se implementan como sucursales. En Subversion, la secuencia de integración puede ser el enlace troncal. Los desarrolladores pueden tener múltiples flujos de desarrollo , y estos flujos de desarrollo pueden representar casi cualquier cosa. Un desarrollador podría tener uno o dos flujos para el desarrollo básico. Tal vez otro para una característica a largo ploop. Algunos lugares tienen una secuencia separada para cada problema.

El flujo de trabajo típico es:

  • El desarrollador crea una secuencia de desarrollo a partir de la secuencia de integración (twig aka).
  • Desarrollador hace su trabajo.
  • El desarrollador reescribe su flujo desde la secuencia de integración . (también conocido como fusionar de tronco a twig)
  • El desarrollador finaliza las testings y vuelve a enviar su flujo de desarrollo a la secuencia de integración (es decir, a merge to trunk).
  • El desarrollador repite el process hasta que el proyecto se completa o muere.

Esta metodología es muy común en Git, donde cada repository local de Git puede considerarse una stream de desarrollo y el repository principal considerado como la stream de integración. También se usa comúnmente en el desarrollo Ágil.

Esta metodología comenzó en la década de 1990 con ClearCase, y luego perdió su popularidad a medida que Perforce, CVS y Subversion se hicieron más populares. Ahora está más de moda ya que parece natural con Git.

De hecho, el desarrollo basado en Steam surgió incluso antes con Sablime. Sablime se basó en SCCS, pero con un sistema de request de modificación (MR) adherido a él. En Sablime, cuando marcabas un cambio, tenía que estar en contra de uno o más MR. La línea de base se llamó genérica y la siguiente genérica se generó mediante la aplicación de un set de MR al genérico anterior.

Tronco inestable

La metodología del tronco inestable surgió alnetworkingedor de 2000 a partir de problemas con el desarrollo basado en flujos. Una es que el desarrollo basado en flujos implica una gran cantidad de fusión. Otro, tomó muchos caballos de fuerza para implementar. Hay un dicho en el mundo CM que las twigs son como niños: si los tienes, debes cuidarlos bien y observarlos con mucho cuidado.

La metodología del troncal inestable comenzó a entrar en juego con la llegada de los sistemas de continuous integration como CruiseControl. En el tronco inestable , casi todo el trabajo se debe hacer en el tronco (o algún tipo de vapor de integración). La bifurcación se realiza en un momento indefinido en el que comienza a entregar el código en la versión actual mientras desea continuar trabajando en la próxima versión. En algunos sitios, aquí es cuando finalmente aparece una versión candidata . En otros sitios, puede ser cuando el lanzamiento sea Feature Complete . Básicamente, es en un momento en que ya no necesita que todo su equipo de desarrollo trabaje en una versión. En sitios muy pequeños con solo un par de desarrolladores, nunca se crea una twig de lanzamiento.

Por cierto , ambas metodologías crean y lanzan en las twigs. Esto se debe a que tanto en el desarrollo basado en flujo como en el tronco inestable , puede llegar a un punto en el que algunas personas estén trabajando en la versión 2.1 mientras que otras están trabajando en la versión 2.2. En el tronco inestable , lo llama una twig de liberación . En el desarrollo basado en flujo , simplemente lo llama otra stream de integración .

La gran diferencia entre los dos es cuando decides qué funciones añadir y cuándo. En el tronco inestable , esto debe hacerse al comienzo de un ciclo de desarrollo (o tal vez al comienzo de un Sprint Ágil). Tienes que hacerlo ya que tu desarrollo depende de la implementación de un problema de cambio y luego el siguiente.

En desarrollo basado en flujo, esto se puede retrasar hasta el final del ciclo. Puede trabajar en los problemas 1001, 1002, 1003, 1004, y luego decidir que solo desea que se entreguen los problemas 1002 y 1004 al flujo de integración.

El principal problema con el desarrollo basado en flujo y la razón por la que perdió popularidad fue la constatación de que está creando flujos en el código que ya no es relevante. Por ejemplo, estoy trabajando en el número 1004. Se han realizado los Issues 1001, 1002 y 1003, pero no se han entregado, por lo que estoy trabajando en una base de código que no incluye los cambios que otros desarrolladores han realizado.

Además, la fusión es una molestia. Tendrá conflictos de fusión, lo que significa que los desarrolladores deben tomarse un time libre del desarrollo para depurar y probar las fusiones.

El desarrollo basado en Stream también significa que las testings no pueden tener lugar hasta que el código realmente se entregue. Cuanto más tarde esperas a la entrega de cambios, less testings de cualquier tipo pueden tener lugar.

Hay forms de evitar estos problemas. El desarrollo ágil interrumpe el desarrollo en sprints y fuerza la entrega al final de cada sprint. Una versión puede constar de 3 a 4 sprints con un quinto sprint final para la limpieza.

Esto impulsa el desarrollo basado en secuencias para que se parezca más al tronco inestable, pero aún puede elegir durante el final de un sprint. Por ejemplo, un desarrollador está trabajando en un problema particular cuando el equipo se da count de que la encoding no está funcionando como debería. Puede haber una decisión de no include este flujo en particular en este sprint y tal vez pensar en una nueva forma de reimplementar esa característica.

El desarrollo basado en Stream también es más amigable con las revisiones de código ya que el código está comprometido, pero aún no está en el flujo de entrega .

La principal ventaja del troncal inestable es la simplicidad, y obliga a los desarrolladores a tomar mordiscos más pequeños cuando realizan cambios. Un cambio particular podría implementarse en varias etapas en lugar de todas a la vez. También facilita la continuous integration y las testings de control de calidad, ya que las testings de control de calidad pueden realizarse en casi cualquier lugar durante el desarrollo.

El desarrollo basado en Stream es más popular entre los desarrolladores y gerentes de proyecto. Los desarrolladores pueden trabajar en los cambios de la manera que deseen, y los gerentes de proyectos pueden retener las funciones que ofrecerán hasta el final de la versión.

El troncal inestable es más popular con QA, leads tecnológicos y CM. QA puede hacer testings mucho antes y encontrar problemas antes del apuro por lanzarlos. A CM le gusta porque hay less sucursales que rastrear, a los gerentes técnicos les gusta porque implica less supervisión en el desarrollo.

Ninguno de estos methods es automático y las diferentes herramientas tienden a prestarse a diferentes prácticas. CVS es inútil con el desarrollo basado en flujo ya que la bifurcación y la fusión es muy costosa. Sin embargo, funciona muy bien con el tronco inestable . Git funciona muy bien con el desarrollo basado en flujo , pero simplemente se convierte en una carga cuando se usa con un tronco inestable .

CVS, Perforce y Subversion tienden a funcionar mejor con trunk inestable . Aunque la ramificación de Subversion tiene un costo mínimo, la fusión sigue siendo una operación bastante descuidada. Git tiende a trabajar con el desarrollo basado en flujo .