¿Qué significa la confirmación atómica para un sistema de versiones?

34

Una de las razones por las cuales los programadores prefieren SVN sobre CVS es que el primero permite confirmaciones atómicas. Qué significa esto ?

Friki
fuente
Esto podría ayudar a alguien , explica de qué se trata (usa git como ejemplo, pero podría aplicarse para otros VCS)
Fagner Brack

Respuestas:

69

Significa que cuando realiza una confirmación en el sistema de control de versiones, todo lo que desea confirmar entra, O nada lo hace.

En CVS, cuando intenta confirmar, es posible que la confirmación tenga éxito en varios archivos y luego falle en varios otros (porque han cambiado). Esto deja el repositorio en un estado desafortunado porque la mitad de su confirmación no está allí, y es probable que haya dejado las cosas en un estado donde no se compilarán o peor. Ahora debe apurarse e integrar cualquier cambio para poder confirmar los otros archivos antes de que alguien más necesite actualizar y obtener su conjunto de cambios roto.

En SVN esto no sucederá: SVN confirmará todo lo que ha cambiado o fallará todo el conjunto de cambios. Por lo tanto, nunca dejará el repositorio en un estado roto debido a problemas de confirmación.

Michael Kohne
fuente
99
Un resultado importante de esto es que si se echa un vistazo en cualquier estado, entonces el resultado es siempre un estado coherente (excluyendo cualquier usuario-error como olvidar a cometer un archivo, por supuesto): Es bien desde antes de la confirmación o de después el compromiso y nada en el medio. En CVS podría ser desde "la mitad del compromiso". El comportamiento SVN es muy bueno para cosas como la integración continua. Para los sistemas CVS, esos sistemas solían imponer un "período de silencio" en el que solo usaban un check-out dado si no se realizaban más commits en un número determinado de segundos / minutos después del checkout.
Joachim Sauer
2
recuerdos oscuros sobre el uso de CVS me acarician mientras he estado leyendo esto.
shabunc
99
@Spoike: cierto, pero es un acto deliberado. En CVS, los problemas pueden ocurrir sin culpa suya, mientras que en SVN tiene que trabajar en ello.
Michael Kohne
3
@DanNeely: CVS los compromete uno por uno. Es por eso que obtienes confirmaciones parciales: algunos de los archivos pasan, luego se detiene cuando llega a uno que no puede confirmar (debido a un conflicto). Creo que es el resultado de que CVS surgió originalmente de RCS.
Michael Kohne
44
Además, tenga en cuenta que con CVS, incluso si no encuentra un error y todo se confirma, alguien con una conexión más rápida podría actualizar su árbol de origen a mitad de la confirmación, dejándolo en un estado inconsistente. (Y espero que las marcas de tiempo sería tan extendido, así que tratar de ver el árbol como de una fecha / hora que cayó en medio de una confirmación tendría resultados similares.)
Samb
15

Esto se explica, por ejemplo, en Bye-bye CVS. He sido subvertido el artículo escrito por Andy Lester :

Si intento comprometerme en Subversion, pero uno de los archivos tiene un conflicto o está desactualizado, ninguno de los archivos se compromete. En CVS, tiene un conjunto de archivos medio comprometidos que debe corregir AHORA MISMO.

El hecho de que CVS obligue al programador a corregir la fusión de inmediato es tan contraproducente como se pone. En comparación con eso, una opción para retrasar / cancelar / fusionar cuidadosamente los cambios es un beneficio sustancial.


Otros beneficios de SVN sobre CVS explicados en el artículo anterior son:

  • Versiones locales de todo lo que haces
     
    Si quieres cvs diff, debes poder conectarte a tu repositorio. Sin conexión de red, sin diferencias. Subversion almacena copias prístinas locales de lo que está trabajando, por lo que svn diff funcionará bien. ¿Quieres empezar de nuevo? svn revert también funciona sin conexión.

  • Nombres simbólicos de las revisiones
     
    HEAD es el nombre de la punta del tronco en CVS, pero siempre he querido poder decir "-r-1" como si pudiera regresar en los días de PVCS. Con CVS, tengo que hacer un registro de cvs en lo que estoy editando, y luego restar uno. Eso no es divertido. Con Subversion, puedo decir svn diff -r PREV.

  • Informes de estado real
     
    En CVS, la única forma de ver si algo en el servidor es más reciente es actualizar cvs y esperar que lo que ocurra no cause ningún conflicto. Con el comando svn status, obtengo un estado real, por lo que puedo ver si hay conflictos ANTES de hacer una actualización.

  • Manejo útil de conflictos de fusión
     
    En CVS, si hay conflictos, obtendrá marcadores de conflicto en su archivo. En Subversion, obtienes marcadores de conflicto, ADEMÁS una copia de tu archivo original previo al conflicto, ADEMÁS de la versión que salió del servidor, ADEMÁS de la versión que estabas editando originalmente. Luego, debe svn resolver explícitamente filename.txt para decirle a Subversion que ha solucionado el problema. No más accidentalmente volviendo a ingresar a CVS con marcadores de conflicto todavía allí.

mosquito
fuente
8

Significa que todos los cambios en todos los archivos se confirman en una sola transacción, por lo que todos tienen éxito o ninguno.

Esto significa que es menos probable que se registren ediciones parciales en el repositorio, lo que hace que las compilaciones fallen. Todavía puede hacer que la gente se olvide de revisar todos los archivos relevantes, pero ese es un problema de proceso en lugar de un problema con el sistema de versiones.

jk.
fuente
¿no es bueno entonces? De lo contrario, una confirmación parcial provocaría que los archivos no estuvieran sincronizados.
Geek
2
sí, es algo bueno, los commits parciales son malos
jk.