¿Cuál es el range óptimo para la cantidad de twigs activas?

Digamos que un proyecto es:

  • 1 producto
  • construido durante Y años
  • que comprende M modules
  • escrito en L [1..3] idiomas
  • desarrollado por un total de desarrolladores D

¿En qué punto un proyecto contiene demasiadas o pocas twigs vivas?

Sé que es una pregunta difícil, es aún más difícil responder numéricamente, sin embargo estoy buscando respuestas cuantificadas, si es posible, por favor haga una fórmula.

Fondo

Si hay muy pocas sucursales, el código nunca está listo, los desarrolladores no hacen grandes cambios porque puede ser imposible cumplir el próximo ploop. Del mismo modo, los gerentes de producto nunca se sienten lo suficientemente seguros para nombrar algo como un lanzamiento. La congelación de funciones a menudo se establece, las ideas nuevas se retrasan y el desarrollo se ralentiza.

Si hay demasiadas twigs, los desarrolladores no están seguros de dónde deberían ir sus cambios y dónde deberían propagarse, qué twig se fusionará con qué tronco. Combinar el código refactorizado es muy difícil. La calidad baja. Además, cada desarrollador tiene que probar sus cambios en varias configuraciones, se desperdicia un esfuerzo considerable, el desarrollo se ralentiza.

¿Cuál es el range óptimo para la cantidad de twigs activas?

¿Cuál es la regla general para determinar que RCS (svn o git) contiene demasiadas twigs?

¿Qué tal la rule of 3 :

  • Una twig para código estable – tronco principal;
  • Una twig para inestable – próximo lanzamiento de lanzamiento;
  • Y uno más para el mantenimiento: correcciones de errores de la versión anterior;

Muchos proyectos hospedados por git usan solo dos twigs: master para main trunk y vNext para lanzamiento futuro.

Utilice la function de tags para marcar los hitos en su desarrollo.

Permita que sus desarrolladores creen sucursales de desarrollo localmente y las fusionen con estas sucursales remotas según la tarea que estén realizando.

Pídales a los desarrolladores que agreguen nombres y descripciones significativos a las sucursales locales. Y la label se compromete en consecuencia.

No hay una sola respuesta a esta pregunta. Solo puede ser "lo que funciona para su organización y flujo de trabajo".

En mi humilde opinión, una vez que una sucursal ha dejado de ser útil (por ejemplo, todos los cambios se fusionaron con el tronco) o un experimento fallido / proyecto de investigación que se abandonó o finalizó), debe eliminarse. Siempre puede recuperarlo si lo necesita, y eso ayudará a mantener las cosas un poco más orderadas.

En function de su edición: si hay twigs que están obsoletas o "muertas", ¿por qué siguen ahí? Por definición, ya no es un uso para ellos, así que simplemente elimínelos.

Si está utilizando git tener múltiples twigs puede ser útil, incluso si están muertos. Puede rastrear en qué versión del producto se introdujo el error (dividido por versiones), puede organizar su trabajo para muchos equipos pequeños. Puedes ver por qué algunas ideas no funcionaron solo mirando twigs muertas.

La key es consistencia. Intenta agrupar tus twigs para que se ajusten a tu flujo de trabajo. Puedes, por ejemplo, tener

  • stable – CI construye producción y / o puesta en escena a partir de este
  • staging – puesta en escena de construcción de CI a partir de este
  • feature/* – twigs para características
  • hotfix/* – comenzada desde la ramificación staging / stable, usada para hotfixes
  • experimental/* – utilizado para la funcionalidad de I + D que podría no dar como resultado un código limpio y mantenible o puede abandonarse a la mitad

Algunos consejos básicos aquí: http://nvie.com/posts/a-successful-git-branching-model/

Además, si quieres que tu equipo empiece a utilizar rápidamente una buena estructura de sucursal, testing git flow: http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/

Acerca de refactorizar el código incorrecto de otros compañeros de trabajo. Puede usar algunas twigs refactor/* para que pueda ver fácilmente qué está roto al tener fusiones / rebases atómicas en una twig separada. Por supuesto, tener testings es EXTREMADAMENTE útil, pero si no lo haces, una simple git bisect te mostrará quién y cuándo introdujo un error (y si escribes una testing para verificar si este error que bisect usaría ahora tienes una testing significativa para agregar a su suite de testing).

La conclusión es: no tengas miedo de tener muchas twigs, solo mantenlas organizadas. Las fusiones la mayor parte del time no son tan complejas como las personas dicen que son y usted siempre puede deshacerlas (o posponerlas hasta la próxima versión si no está usando el model de entrega continua).

EDITAR: por something/* quiero decir está teniendo múltiples twigs con un something/ común something/ prefijo, imitando así una estructura de directory.

EDIT2: las cosas son diferentes en SVN-likes, donde la bifurcación y la fusión no es tan barata. Proceda con precaución 😉

EDIT3: Considere usar diferentes (sub) repositorys para diferentes modules. Puede simplificar el desarrollo. Los desarrolladores de modules solo están preocupados por la última versión estable de la aplicación principal y el model de sucursal solo está orientado a un solo module.

EDIT4: P: "¿podría considerar poner algunos numbers o fórmulas en el umbral por debajo del cual la ramificación desorderada es aceptable y por encima de qué twigs se organicen mejor?"

¡Por supuesto!

La fórmula (en mi humilde opinión) es simple.

  • tenga tantas twigs "sucias" a nivel local como desee (simplemente no las envíe a otras personas ni repositorys compartidos)
  • trate de no empujar twigs sucias a less que representen algún valor para otros desarrolladores. Si ya los tiene en su depósito compartido, consérvelos y cámbieles el nombre ( legacy/* o plain dirty/* viene a la mente).

Piense en ellos como una estructura de files. Puede tener muchos files henetworkingados que ya no son necesarios, pero si los mantiene de forma organizada, puede separar fácilmente el file de su set de trabajo.

Al ver los numbers que te gustan, probablemente quieras un caso de uso del mundo real para esas sucursales

Déjame darte un ejemplo de un proyecto PHP de Symfony2 de tamaño medio pequeño en el que he estado trabajando.

Si tiene un proyecto que se desarrolla durante 6-9 meses, desarrollado activamente por 5 desarrolladores de manera ágil (scrum) con una demostración del cliente cada dos semanas, es posible que desee tener sucursales:

  • por historia del usuario (en historias de usuarios estrechamente integradas esto podría ser una mala idea), alnetworkingedor de 50 sucursales en total, piense en ellas como sucursales de características
  • por desarrollador (a pedido, si el desarrollador necesita trabajar en algo por un time), van y vienen, pero generalmente los desarrolladores tienen less de 3 en este tipo de proyectos. Algunos de ellos no usan twigs públicas de desarrolladores y mantienen sus twigs sucias para ellos mismos
  • experimental (número ilimitado de twigs con fines de investigación, por ejemplo, algorithm diferente o biblioteca utilizada en el module), alnetworkingedor de 7 twigs por lo que recuerdo
  • por sprint (fusionado de historias de usuarios, útiles para la demo), alnetworkingedor de 10, estos somos nuestros staging / stable durante el desarrollo inicial. ¿Por qué no las tags? También tags, pero twigs porque es más fácil aplicar una revisión.
  • revisiones (generalmente de corta vida, aisladas para facilitar la selección de cerezas), 3 tops;)
  • Misceláneo (por lo general, características de todo el sistema en todo el sistema y / o sucursales de equipo de 2-3 personas), alnetworkingedor de 10

Como puede ver, tampoco hay un número exacto aquí. He realizado varios proyectos de este tamaño y la mayoría de ellos tenían alnetworkingedor de 70-80 sucursales (20-30 sin twigs de historias de usuarios). Si están organizados de una manera lógica y limpia, el repository de códigos es fácil de navegar.

Con Git, considere también reestabilizar en lugar de fusionar, por lo que no obtendrá burbujas de fusión (consulte este artículo http://stevenharman.net/git-pull-with-automatic-rebase ).

Para Git y SVN hay diferentes forms de ver esto. Pero lo más importante es lo que significa tener demasiadas cosas, ya sea por motivos de performance o de organización.

Entonces, performance git :

En git, una twig no es más que una reference a un object que es parte del repository de git. Por lo tanto, no hay una sobrecarga importante para este object twig. (mira http://git-scm.com/book/es/Git-Branching-What-a-Branch-Is para más información) Si destruyes la twig, todavía tienes TODO el historial de git en tu repository, es solo una cuestión de llegar a eso. En general, no hay espacio de almacenamiento adicional para la sucursal. Si está utilizando twigs desechables, elimínelas, pero sus confirmaciones aún existen. El performance general de git se ralentiza por el tamaño del repository, pero las twigs no se crean para boost, las confirmaciones sí. Puede volver a embalar o eliminar objects para limpiar y acelerar su git repo.

Así que el performance de SVN :

En SVN, las twigs son copys de su tree de trabajo, sin embargo, estas copys no son datos duplicates. De nuevo, son references al tree existente, siempre que se use svn-copy. (ver http://svnbook.networking-bean.com/en/1.1/ch04s02.html#svn-ch-4-sect-2.1 para más información) SVN maneja bien los files grandes y los repositorys, pero de nuevo, el tamaño del El repository no se ve muy afectado por las sucursales, sino que es eficiente y barato. De hecho, citando el svnbook: "El punto principal aquí es que las copys son baratas, tanto en el time como en el espacio. Haga las twigs con la frecuencia que desee".

Organización de SVN y git :

Como dije antes, la bifurcación es barata, por lo que puede ocurrir a menudo, las twigs desechables deben eliminarse, pero las sucursales históricas son baratas de mantener. Básicamente, debe tener una manera fácil de nombrar sus sucursales por convención: release_1, bugfix_200, temp_branch_for_fun, cualquier cosa que haga que el nombre se autoorganice cuando se listn alfa-numéricamente. Usar tags también es agradable, tanto en SVN como en git: las personas tienden a sentirse más cómodas con las twigs, sin embargo, en git son realmente las mismas y en SVN, son útiles para la reference de puntos en el time.

¿Cuántas son demasiadas sucursales? Esa es una decisión lógica de negocios. Prefiero tener muchas twigs desechables para Work In Progress, aunque solo tengo twigs históricas para lanzamientos. Pero eso solo es bueno en un flujo de trabajo iterativo. Recientemente, he estado moviendo el desarrollo hacia un flujo de trabajo de Entrega Continua y una networking distribuida de git bifurcada, entonces no me importan cuántas sucursales tenga el fork del git del desarrollador, en cambio mi origen o el repository Mainline solo tiene una twig permanente: master y twigs desechables para hotfixes críticos de alta prioridad.

La metodología que mencioné anteriormente ha funcionado muy bien, ya que ahora cada desarrollador puede ramificarse y olvidarse todo lo que quiera sin molestar a ningún otro desarrollador. Además, mi maestro se mantiene libre de desorder de sucursales. (Esto también funcionará para un Enfoque iterativo, y tendría twigs solo para lanzamientos, sin ramificaciones temporales ni desechables).

Todos están felices.

¿Cuál es la regla general para determinar que RCS (svn o git) contiene demasiadas twigs?

Ninguna. Tal regla común no existe y (si todavía se puede definir localmente) por fin depende mucho del equipo y del flujo de trabajo.

Con "Sucursal por tarea", es posible que tenga muchas sucursales a corto ploop, incluso para la base de código de tamaño pequeño y mediano (para cualquier tamaño de equipo y cantidad de idiomas en uso)

Movido de comentario:

1-N twigs de tareas no cerradas por desarrollador (N depende de muchos factores) 1-2 activas por desarrollador + algunas comunes compartidas (estable-inestable-liberado -…)

Las twigs en git se consideran desechables. Si no lo necesitas y no lo volverás a usar, lo dejas caer. Sin embargo, en mi caso, administro muchas sucursales, pero solo el 1% de ellas están en uso. Cerré el rest y me aseguré de tener las tags adecuadas aplicadas a la versión de lanzamiento.

Es posible que deba definir si todas las twigs en cuestión están activas a la vez. Como puede tener 100 twigs pero solo 1 está en uso. Pero si tuviera 100 sucursales activas para 1 proyecto, entonces SÍ, diré que es demasiado y solo muestra una mala gestión.

Espero que esto ayude !

Si desea archivar sucursales, creo que la solución habitual es llevarlas a un repository de files y luego eliminarlas; si alguna vez quieres recuperarlos, sabes dónde searchlos.