Comparación entre sistemas de control de versiones centralizadas y distribuidas

¿Cuáles son los beneficios y desventajas con el uso de Sistemas de Control de Versión Centralizados versus Distribuidos (DVCS)? ¿Ha tenido algún problema con DVCS y cómo se ha salvaguardado de estos problemas? Mantenga la herramienta de discusión agnóstica y llameante al mínimo.

Para aquellos que se preguntan qué herramientas de DVCS están disponibles, aquí hay una list de los DVCS gratuitos / de código abierto más conocidos:

  • Git , (escrito en C) utilizado por Linux Kernel y Ruby on Rails .
  • Mercurial , (escrito en Python) utilizado por Mozilla y OpenJDK .
  • Bazar , (escrito en Python) utilizado por los desarrolladores de Ubuntu .
  • Darcs , (escrito en Haskell).

De mi respuesta a una pregunta diferente:

Los sistemas de control de versiones distribuidas (DVCS) resuelven diferentes problemas que los VCS centralizados. Compararlos es como comparar martillos y destornilladores.

Los sistemas centralizados de VCS están diseñados con la intención de que haya una sola fuente verdadera bendecida y, por lo tanto, buena. Todos los desarrolladores trabajan (checkout) desde esa fuente, y luego agregan (confirman) sus cambios, que luego se bendicen de manera similar. La única diferencia real entre CVS, Subversion, ClearCase, Perforce, VisualSourceSafe y todos los demás CVCS está en el flujo de trabajo, el performance y la integración que ofrece cada producto.

Los sistemas distribuidos de VCS están diseñados con la intención de que un repository sea tan bueno como cualquier otro, y que las fusiones de un repository a otro sean solo otra forma de comunicación. Cualquier valor semántico en cuanto a qué depósito se debe confiar se impone desde el exterior por el process, no por el software en sí.

La elección real entre el uso de un tipo u otro es organizacional: si su proyecto u organización desea un control centralizado, entonces un DVCS no es un iniciador. Si se espera que sus desarrolladores trabajen en todo el país / mundo, sin conexiones seguras de banda ancha a un repository central, entonces DVCS es probablemente su salvación. Si necesitas ambas, estás fsck'd.

Para aquellos que piensan que los sistemas distribuidos no permiten copys autorizadas, tenga en count que hay muchos lugares donde los sistemas distribuidos tienen copys autorizadas, el ejemplo perfecto es probablemente el tree kernel de Linus. Seguro que mucha gente tiene sus propios treees, pero casi todos fluyen hacia el tree de Linus.

Dicho esto, solía pensar que los SCM distribuidos solo eran útiles para muchos desarrolladores que hacían cosas diferentes, pero recientemente decidieron que todo lo que un repository centralizado puede hacer, distribuido, puede hacerlo mejor.

Por ejemplo, supongamos que eres un desarrollador en solitario que trabaja en tu propio proyecto personal. Un repository centralizado podría ser una opción obvia, pero considere este escenario. Estás lejos del acceso a la networking (en un avión, en un parque, etc.) y quieres trabajar en tu proyecto. Tiene su copy local para que pueda trabajar bien pero realmente desea comprometerse porque ha terminado una característica y desea pasar a otra, o ha encontrado un error para arreglar o lo que sea. El punto es que con un repository centralizado termina machacando todos los cambios juntos y comprometiéndolos en un set de cambios no lógico o los divide manualmente más tarde.

Con un repository distribuido puede continuar como siempre, comprometerse, seguir adelante, cuando tenga acceso a la networking nuevamente, presione hacia su "único repository verdadero" y nada cambiará.

Por no mencionar la otra cosa agradable acerca de los repos distribuidos: historia completa disponible siempre. ¿Necesita ver los loggings de revisión cuando está fuera de la networking? ¿Necesita anotar la fuente para ver cómo se introdujo un error? Todo es posible con repos distribuidos.

Por favor, no crean que distribuido vs centralizado es sobre propiedad o copys autorizadas o algo por el estilo. La realidad que se distribuye es el siguiente paso en la evolución de SCM.

No es realmente una comparación, pero aquí están los grandes proyectos que están usando:

VCS centralizados

  • Subversión

    Apache, GCC, Ruby, MPlayer, Zope, Plone, Xiph, FreeBSD, WebKit, …

  • CVS

    CVS

VCS distribuidos

  • git

    Kernel de Linux, KDE, Perl, Ruby on Rails, Android, Wine, Fedora, X.org, Mediawiki, Django, VLC, Mono, Gnome, Samba, CUPS, GnuPG, Emacs ELPA …

  • mercurial (hg)

    Mozilla y Mozdev, OpenJDK (Java), OpenSolaris, ALSA, NTFS-3G, Dovecot, MoinMoin, mutt, PETSc, Octave, FEniCS, Aptitude, Python, XEmacs, Xen, Vim, Xine …

  • bzr

    Emacs, Apt, Mailman, MySQL, Squid, … también promocionado dentro de Ubuntu.

  • Darcs

    ghc, ion, xmonad, … popular dentro de la comunidad Haskell.

  • fósil

    SQLite

W. Craig Trader dijo esto sobre DVCS y CVCS:

Si necesitas ambas, estás fsck'd.

No diría que estás fsckd cuando usas ambos. Prácticamente los desarrolladores que usan herramientas DVCS generalmente intentan fusionar sus cambios (o enviar requestes de extracción) contra una location central (generalmente a una twig de publicación en un repository de versiones). Existe cierta ironía con los desarrolladores que usan DVCS pero que al final se atienen a un flujo de trabajo centralizado, puede comenzar a preguntarse si el enfoque distribuido realmente es mejor que el centralizado.

Hay algunas ventajas con DVCS en un CVCS:

  • La noción de compromisos únicos y reconocibles hace que el envío de parches entre pares sea sencillo. Es decir, haces que el parche sea un compromiso, y lo compartes con otros desarrolladores que lo necesiten. Más tarde, cuando todo el mundo quiere fusionar, que se comprometen en particular se reconoce y se pueden comparar entre las twigs, que tienen less posibilidades de conflicto de combinación. Los desarrolladores tienden a enviarse parches entre ellos mediante dispositivo USB o correo electrónico, independientemente de la herramienta de control de versiones que utilice. Desafortunadamente en el caso de CVCS, el control de versiones registrará las confirmaciones como separadas, sin reconocer que los cambios son los mismos, lo que aumenta las posibilidades de que se produzca un conflicto.

  • Usted puede tener twigs experimentales locales (repositorys clonados también pueden considerarse una twig) que no es necesario para mostrar a los demás. Eso significa que no es necesario que los cambios de última hora afecten a los desarrolladores si no has impulsado nada en sentido ascendente. En un CVC, cuando usted todavía tiene un cambio de última hora, puede que tenga que trabajar fuera de línea hasta que haya solucionado y confirmar los cambios para entonces. Este enfoque efectivamente frustra el propósito de usar el control de versiones como una networking de security, pero es un mal necesario en CVCS.

  • En el mundo actual, las empresas suelen trabajar con los desarrolladores off-shore (o aún mejor si quieren trabajar desde casa). Tener un DVCS ayuda a este tipo de proyectos a cabo, ya que elimina la necesidad de una connection de networking fiables, ya que cada uno tiene su propio repository.

… y algunas desventajas que generalmente tienen soluciones temporales:

  • ¿Quién tiene la última revisión? En un CVC, el tronco por lo general tiene la última revisión, pero en un DVCS puede que no sea claramente evidente. La solución consiste en utilizar reglas de conducta para que los desarrolladores de un proyecto lleguen a un acuerdo en el que repo fusionar su trabajo.

  • Los lockings pesimistas, es decir, un file está bloqueado al hacer un check-out, generalmente no son posibles debido a la concurrency que puede ocurrir entre los depósitos en DVCS. La razón por la cual el locking de files existe en el control de versiones se debe a que los desarrolladores desean evitar los conflictos de combinación. Sin embargo, el locking tiene la desventaja de desacelerar el desarrollo ya que dos desarrolladores no pueden trabajar en la misma pieza de código simultáneamente que con un model de transacción largo y no es una garantía de testing completa contra los conflictos de fusión. La única manera sensata, independientemente del control de versión, es combatir grandes conflictos de fusión es tener una buena architecture de código (cohesión baja de alta cohesión) y dividir sus tareas de trabajo para que tengan un bajo impacto en el código (lo cual es más fácil decirlo que hacerlo) .

  • En proyectos de propiedad privada sería desastroso si todo el repository estuviera disponible públicamente. Aún más si un progtwigdor descontento o malicioso se apodera de un repository clonado. La fuga de código fuente es un dolor severo para las empresas propietarias. DVCS lo simplifica, ya que solo necesita clonar el repository, mientras que algunos sistemas CM (como ClearCase) intentan restringir ese acceso. Sin embargo, en mi opinión, si tiene una cantidad suficiente de disfuncionalidad en la cultura de su compañía, entonces ningún control de versiones en el mundo lo ayudará a evitar la fuga de código fuente.

Durante mi búsqueda del SCM correcto, encontré los siguientes enlaces para ser de gran ayuda:

  1. Mejor Iniciativa SCM: Comparación . Comparación de aproximadamente 26 sistemas de control de versiones.
  2. Comparación del software de control de revisiones . Artículo de Wikipedia que compara aproximadamente 38 sistemas de control de versiones que cubren temas como diferencias técnicas, características, interfaces de usuario y más.
  3. Sistemas de control de versiones distribuidas . Otra comparación, pero se centró principalmente en sistemas distribuidos.

Hasta cierto punto, los dos esquemas son equivalentes:

  • Un VCS distribuido puede emular trivialmente uno centralizado si siempre empuja sus cambios a algún repository en sentido ascendente designado después de cada confirmación local.
  • Por lo general, un VCS centralizado no podrá emular a uno distribuido de forma tan natural, pero puede get algo muy similar si usa algo parecido a una colcha encima. Quilt, si no está familiarizado con él, es una herramienta para administrar grandes sets de parches sobre algún proyecto en sentido ascendente. La idea aquí es que el command de confirmación DVCS se implemente mediante la creación de un nuevo parche, y el command push se implementa al comprometer cada parche sobresaliente al VCS centralizado y luego descartar los files de parche. Esto suena un poco incómodo, pero en la práctica, en realidad funciona bastante bien.

Una vez dicho esto, hay un par de cosas que los DVCS tradicionalmente hacen muy bien y de los cuales los VCS más centralizados son un poco exagerados. Probablemente, el más importante de estos sea el de la bifurcación: un DVCS facilitará la bifurcación del repository o la fusión de sucursales que ya no son necesarias, y hará un seguimiento del historial mientras lo hace. No hay una razón particular por la cual un esquema centralizado tenga problemas con esto, pero históricamente nadie parece haberlo logrado todavía. Si eso es realmente un problema para usted depende de cómo va a organizar el desarrollo, pero para muchas personas es una consideración importante.

La otra ventaja de DVCSes es que trabajan fuera de línea. Nunca he tenido mucho uso para eso; Principalmente desarrollo en la oficina (por lo que el repository está en la networking local) o en casa (por lo que hay ADSL). Si hace un gran desarrollo en las computadoras portátiles mientras viaja, esto podría ser más una consideración para usted.

En realidad, no hay muchos errores específicos de DVCS. Hay una tendencia levemente mayor a que las personas se callen, porque puedes comprometerte sin presionar y es fácil terminar puliendo cosas en privado, pero aparte de eso no hemos tenido muchos problemas. Esto puede deberse a que tenemos un número significativo de desarrolladores de código abierto, que por lo general están familiarizados con el model de desarrollo de parche comercial, pero los desarrolladores entrantes de código cerrado también parecen recoger las cosas de manera razonablemente rápida.

Los VCS distribuidos son atractivos de muchas maneras, pero una desventaja que será importante para mi empresa es la gestión de files que no se pueden combinar (normalmente binarys, por ejemplo, documentos de Excel). Subversion se encarga de esto al admitir la propiedad "svn: needs-lock", lo que significa que debe get un candado para el file que no es mergable antes de editarlo. Funciona bien. Pero ese flujo de trabajo requiere un model de repository centralizado, que es contrario al concepto de DVCS.

Por lo tanto, si desea utilizar un DVCS, no es realmente apropiado para administrar files que no se pueden combinar.

He estado usando la subversión durante muchos años y estaba muy contento con ella.

Entonces comenzó el zumbido de GIT y solo tuve que probarlo. Y para mí, el principal argumento de venta fue la ramificación. Oh chico. Ahora ya no necesito limpiar mi repository, retroceder algunas versiones o cualquiera de las cosas tontas que hice cuando uso subversion. Todo es barato en dvcs. Sin embargo, solo he probado fósiles y git, pero he usado forzadamente, cvs y subversión y parece que todos los dvcs tienen ramificaciones y labeldos realmente baratos. Ya no es necesario copyr todo el código en un lado y, por lo tanto, la fusión es simplemente una brisa.

Cualquier dvcs se puede configurar con un server central, pero lo que obtienes es, entre otras cosas

Puedes registrar cualquier cambio pequeño que desees, ya que Linus dice que si necesitas usar más de una oración para describir lo que acabas de hacer, estás haciendo demasiado. Puede hacer su trabajo con el código, la bifurcación, la fusión, la clonación y la testing local sin que nadie descargue gran cantidad de datos. Y solo necesita insert los cambios finales en el server central.

Y puedes trabajar sin networking.

En resumen, usar un control de versiones siempre es algo bueno. Usar dvcs es más barato (en KB y ancho de banda), y creo que es más divertido de usar.

Para finalizar la compra de Git: http://git-scm.com/
Para finalizar la compra de Fossil: http://www.fossil-scm.org
Para pagar Mercurial: https://www.mercurial-scm.org

Ahora, solo puedo recomendar sistemas dvcs, y usted puede usar fácilmente un server central

El problema principal (aparte del problema obvio del ancho de banda) es la propiedad .

Eso es para estar seguro de que el sitio diferente (geográfico) no está trabajando en el mismo elemento que el otro.

Idealmente, la herramienta puede asignar propiedad a un file, una twig o incluso un repository.

Para responder a los comentarios de esta respuesta, realmente desea que la herramienta le diga quién posee qué, y luego se comunique (a través del teléfono, IM o correo) con el sitio distante.
Si no tiene el mecanismo de propiedad … se "comunicará", pero a menudo demasiado tarde;) (es decir, después de haber hecho un desarrollo concurrente en un set idéntico de files en la misma twig. El compromiso puede volverse desorderado)

Para mí, esta es otra discusión sobre un gusto personal y es bastante difícil ser realmente objective. Yo personalmente prefiero Mercurial sobre el otro DVCS. Me gusta escribir anzuelos en el mismo idioma en el que está escrito Mercurial y la sobrecarga de networking más pequeña, solo para decir algunos de mis motivos.

Todos estos días están en el carro de cómo los DVCS son superiores, pero el comentario de Craig es importante. En un DVCS, cada persona tiene el historial completo de la sucursal. Si está trabajando con muchos files binarys (por ejemplo, files de image o FLA), esto requiere una gran cantidad de espacio y no puede hacer diffs.

Tengo la sensación de que Mercurial (y otros DVCS) son más sofisticados que los centralizados. Por ejemplo, la fusión de una sucursal en Mercurial conserva el historial completo de la sucursal, mientras que en SVN debe ir al directory de sucursal para ver el historial.

Otra ventaja para SCM distribuido incluso en el caso de un desarrollador individual es si usted, como muchos de nosotros, tiene más de una máquina en la que trabaja.

Digamos que tienes un set de scripts comunes. Si cada máquina en la que trabaja tiene un clon, puede bajo demanda actualizar y cambiar sus scripts. Te lo dá:

  1. un ahorro de time, especialmente con las teclas ssh
  2. una forma de ramificar las diferencias entre diferentes sistemas (por ejemplo, Red Hat vs Debian, BSD vs Linux, etc.)

La respuesta de W. Craig Trader resume la mayor parte, sin embargo, creo que el estilo de trabajo personal también marca una gran diferencia. Donde trabajo actualmente usamos la subversión como nuestra única fuente verdadera, sin embargo, muchos desarrolladores usan git-svn en sus máquinas personales para compensar el problema del flujo de trabajo que tenemos (falla de administración, pero esa es otra historia). En todo caso. realmente se trata de equilibrar qué sets de características te hacen más productivo con lo que la organización necesita (authentication centralizada, por ejemplo).

Un sistema centralizado no necesariamente le impide usar twigs separadas para hacer el desarrollo. No es necesario que haya una sola copy verdadera de la base de código, en lugar de diferentes desarrolladores o equipos pueden tener diferentes twigs, pueden existir twigs henetworkingadas, etc.

Lo que generalmente significa es que el repository se administra de forma centralizada, pero eso generalmente es una ventaja en una empresa con un departamento de TI competente porque significa que solo hay un lugar para realizar copys de security y solo un lugar para administrar el almacenamiento.