¿Qué tan adecuado es un DVCS para el entorno corporativo?

He estado usando SVN desde hace un time, y estoy muy contento con la forma en que funciona (pero no puedo decir que soy un experto, y realmente no he hecho mucho con las sucursales y la fusión). Sin embargo, ha surgido la oportunidad de introducir algunas prácticas nuevas en un nuevo equipo, así que pensé en echar un vistazo a las DVCS para ver si vale la pena dar el salto.

La empresa para la que trabajo es una empresa bastante estándar en la que todos trabajamos en el mismo lugar (o a veces en casa) y queremos mantener un almacén central de todo el código.

Mi pregunta es: si todo lo que estás haciendo con un DVCS es crear un centro central en el que todo el mundo impulsa sus cambios, ¿hay realmente algún beneficio al pasar a un DVCS y sus gastos adicionales en este tipo de entorno?

Con DVCS, las personas pueden mantener sus propias sucursales locales sin realizar ningún cambio en el repository central, e impulsar sus cambios al repository principal cuando creen que está cocinado. Nuestro proyecto está almacenado en un repository SVN pero personalmente utilizo git-svn para administrar mis cambios locales y lo encuentro bastante útil, porque no podemos enviar todos los cambios de inmediato (primero tienen que ser aprobados por el integrador).

Todo depende de cómo quieras trabajar en los proyectos. Los entornos distribuidos son geniales si todos quieren build en su propia sucursal. Prefiero un repository central para mi trabajo (en un equipo pequeño) ya que hace que los desarrolladores piensen en lanzar una versión de nuestro producto.

En mi experiencia, veo a muchos usuarios de DVCS que piensan en sus propios cambios como aquellos que no tienen que revisar y estos usuarios revisan los cambios de todos los demás desarrolladores antes de fusionarlos en su propio tree. Me gusta ver mis cambios como el cambio al producto principal, por lo que reviso estos cambios antes de enviarlos. Como resultado, tratamos de mantener el producto bastante estable durante todo el ciclo de desarrollo. Refactorizar funciona bien, ya que todos actualizamos a menudo.

Varios usuarios de DVCS que conozco prefieren trabajar en su function en un tree independiente y dejar la integración con el producto central en la fase final de su desarrollo. Esto funciona bien si la característica es independiente, pero no me gustaría ser quien tenga que integrar todas las características desarrolladas de esta manera con un ploop a la vista.

Si se integra a menudo, los DVCS no difieren mucho de los VCS centrales, y la mayoría de los DVCS admiten un repository central, mientras que cada vez más VCS centrales admiten varias características que antes eran exclusivas de DVCS, como la confirmación y el almacenamiento sin connection.

(Para su información: se han planificado compromisos fuera de línea para Subversion 1.8)

Personalmente, creo que es un gran beneficio. Incluso con un repository central, un DVCS cambia el flujo de "editar código, actualizar desde central, confirmar" a "editar código, confirmar, enviar a central". Entre otras cosas, eso significa que la resolución de conflictos es mucho less estresante. También puede fomentar el desarrollo en trozos más pequeños, ya que no tiene que presionar después de cada compromiso. Si tu equipo está de acuerdo con eso, eso significa que tus compromisos individuales pueden dejar la aplicación en un estado extraño, siempre y cuando funcione cuando finalmente presionas al repository central. Si no están de acuerdo con eso, siempre y cuando estés usando git (o queues de parche para hg , IIRC), aún puedes hacer dev con el mismo estilo, pero luego condensas tus commits más pequeños en un commit más grande que es completa antes de empujarlo al repository central.

El gran beneficio de usar un DVCS para mí es que puedo comprometerme con mi repository local sin tener que compartir estos cambios con todos los demás. Así que cuando trabajo en un gran cambio hago pequeños commits incrementales, lo que significa que puedo revertir solo los últimos 30 minutos de trabajo, o hacer una diferencia con una versión que estaba funcionando ayer, pero solo presionar al repository central una vez que todo mi trabajo está completo .

Creo que solo vale la pena pasar a un DVCS por este beneficio.

Sin embargo, el uso de un DVCS requiere un poco más de reflexión y comprensión y el uso de un sistema de control de versiones "estándar" como SVN o CVS, por lo que tendrá que considerar la sobrecarga de capacitación si se mueve a un DVCS o su depósito central terminará lleno de un muchas twigs diferentes que la gente no se dio count de que estaban creando.

Obtendrás la inevitable guerra de Git contra Mercurial comenzando aquí pronto … 🙂 Personalmente uso Mercurial, pero lo que tengo que decir debería ser adecuado para todos los DVCS.

En mi opinión, sí, son adecuados para uso corporativo. Los uso en mi propia empresa, aunque con un pequeño número de desarrolladores que la usan, pero si te preocupa la escalabilidad, mira los grandes proyectos de Código abierto usando git y mercurial, por ejemplo, Mozilla, Python.

El enfoque del hub central funciona bien: es un model de trabajo familiar para los usuarios de subversión y siempre tienes una versión "definitiva". Bloquea el acceso a esto y aplica cualquier gancho para hacer cumplir las políticas de compromiso y, después de eso, los desarrolladores tienen una gran cantidad de libertad para trabajar cómo les gusta con sus copys locales.

Otra gran ventaja es que he encontrado fusión mucho less dolorosa con mercurial que con subversión.

Lo que es más complicado con un DVCS es administrar files binarys; no se puede requerir un locking en un file binary como se puede con la subversión (entre otros). Administre esto con comunicación idealmente.

Finalmente, la clonación de un repository es ideal para mantener las cajas sincronizadas si trabajas desde varias PC.

Espero que esto ayude. K

Creo que el principal beneficio de un DVCS viene cuando desea enviar sus cambios directamente a otras personas (o máquinas, por ejemplo, llevar el repository a su casa), sin pasar por un centro central. Si tiene la necesidad de hacer esto, un DVCS es definitivamente el path a seguir. Si, como dices,

todo lo que está haciendo con un DVCS es crear un centro central en el que todos empujen sus cambios a

entonces no estás realmente aprovechando el propósito principal de un DVCS y yo diría que SVN es suficiente.

PS One también podría argumentar que un DVCS alienta a los usuarios a comprometerse más a menudo, ya que pueden hacerlo en su repository personal y solo publicar sus cambios cuando estén listos, pero esto se puede lograr fácilmente en SVN utilizando sucursales, con el único "Downside" es que las confirmaciones "personales" incrementan el número de versión de todo el repository.

Incluso con un flujo de trabajo concentrado, un DVCS le permite realizar pequeños commits localmente, fusionarlos solo cuando lo desee e insertlos cuando estén listos.

Con un DVCS no, se lo fuerza a:

  1. haz tu trabajo sin comprometerte, hasta que esté pulido y presiones un gran compromiso.
  2. realice pequeños commits sobre la marcha, que todos deben fusionarse con frecuencia, aunque fusionar compromisos intermedios no les aporta nada de valor.

Y si explora un callejón sin salida, sin DVCS: con el primer método, no puede rebobinar, no tiene un compromiso para volver a; con el segundo, tanto los commits como los reverts tenían que ser combinados inútilmente por todos los demás.

Personalmente, creo que la mayor ventaja de DVCS es que se compromete (localmente) antes de la fusión, por lo que si a mitad de la fusión resulta ser más complejo de lo que pensaba originalmente, es trivial volver a un estado limpio sin perder su trabajo . compare con CVCS donde generalmente tiene que fusionarse exitosamente antes de poder comprometerse.

ventajas adicionales incluyen:

  • Trabajar desde casa / en el sitio de los clientes es más fácil ya que no requiere connection de networking solo para verificar algo, y si espera hasta la base para impulsar cambios, se preserva el historial en lugar de agrupar todo en un solo cambio.
  • La mayoría de las operaciones de DVCS son en realidad mucho más rápidas, ya que no necesitan extraer datos a través de la networking
  • Algunas cosas (p. Ej. Scripts de configuration de usuario) se comparten mejor directamente entre los desarrolladores que desean compartirlas en lugar de a través de una location central

En mi experiencia, hay varias maneras de usar un DVCS dentro de un entorno corporativo:

  • Soporte multisitio: ha separado equipos y utiliza su DVCS para configurar diferentes "serveres" en cada location, de modo que no estén limitados por los problemas de networking subyacentes (y créanme, habrá). Solía ​​hacerse con "cosas grandes" como Clearcase Multi-site o Wandisco (para SVN / CVS), pero ahora es bastante factible con los sistemas DVCS.

  • Apoya a los "usuarios itinerantes": eres un corp. desarrollador pero desea trabajar en casa por un time determinado (o nunca): en lugar de depender de la VPN, puede tener un DVCS en su computadora portátil y luego puede comprometer, revisar, diferenciar, ramificar y fusionar sin ser lento abajo por el server central. Se sincroniza de nuevo cuando está en línea o de vuelta en la oficina.

  • Verdadero "desarrollo distribuido": que es el caso extremo: cada desarrollador tiene su propio DVCS (como lo haría en el mundo OSS). Realmente dependerá de las habilidades y la motivación del equipo: si el equipo realmente quiere avanzar, se beneficiarán, de lo contrario será la pesadilla de SYSADM tener que gestionar ni un solo depósito, sino cientos … con sus problemas correspondientes.

la sobrecarga no es tan grande, de hecho, en nuestro entorno, el empuje de hg agregado es less costoso que comprometerse con el svn repo central. pero la mayor ventaja son todas las campanas y silbatos que vienen con mercurial, que son excelentes para un desarrollador individual, independientemente del tamaño del equipo o el flujo de trabajo. en primer lugar, el hecho de que cada WC sea un repository es excelente, ya que puede experimentar mucho más libremente sin contaminar el repository maestro. entonces, hay una funcionalidad que se basa en la igualdad de wc == repo: bisect para encontrar rápidamente la revisión donde se introdujo un error, grep para, bueno, grep el historial, así como la funcionalidad que simplemente falta de la subversión, como diffs coloreados en el terminal.

Bazaar VCS puede funcionar como VCS distribuido y como VCS centralizado para que tenga la libertad de seleccionar el flujo de trabajo que necesita. Al mismo time, las sucursales privadas locales (donde las personas pueden experimentar mientras trabajan en nuevas funciones y al mismo time comprometer su progreso regularmente) es un gran beneficio.

Además, DVCS realiza un flujo de trabajo de desarrollo natural cuando se requiere la revisión obligatoria del código antes de que los nuevos cambios se conecten al enlace troncal. Este flujo de trabajo (con respecto a SVN) se describe shinymente en el artículo UQDS . Y a pesar de que el artículo describió el flujo de trabajo basado en SVN, lo encontrará más natural cuando use cualquier DVCS en lugar de SVN, porque en DVCS la bifurcación y fusión es una operación básica de primera class.