{"id":55,"date":"2009-04-24T00:56:07","date_gmt":"2009-04-23T22:56:07","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=55"},"modified":"2022-08-20T18:26:12","modified_gmt":"2022-08-20T16:26:12","slug":"vc-version-control-en-emacs","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=55","title":{"rendered":"VC (Version Control) en emacs"},"content":{"rendered":"<p>Emacs provee de un front-end que agiliza el uso de control de versiones, dicha feature se llama <strong>VC <\/strong>(<strong>Version Control<\/strong>) y permite usar de forma generalizada distintos controles de versiones mediante una misma interfaz. Los controles de versiones soportados son <strong>SCCS<\/strong>, <strong>RCS<\/strong>, <strong>CVS<\/strong>, <strong>SVN, GIT <\/strong>y dem\u00e1s, aunque algunos de ellos no estan adaptados perfectamente o requieren de alg\u00fan otro front-end m\u00e1s espec\u00edfico para ellos mismos, como es el caso de emergente GIT.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Modelo tradicional vs concurrente <\/span><\/strong><\/p>\n<p>Existen dos modelos basicos a hora de trabajar con controles de versiones, uno es el tradiciona y otro el concurrente que muestro a continuacion para notar las diferencias:<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #0000ff;\">Modelo tradicional:<br \/>\n<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2009\/04\/tradicional.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-56\" title=\"tradicional\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2009\/04\/tradicional.png\" alt=\"modelo tradicional\" width=\"500\" height=\"293\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2009\/04\/tradicional.png 562w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2009\/04\/tradicional-299x176.png 299w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #0000ff;\"><strong>Modelo concurrente:<\/strong><\/span><\/p>\n<p style=\"padding-left: 30px;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2009\/04\/concurrent.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-57\" title=\"concurrente\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2009\/04\/concurrent.png\" alt=\"concurrente\" width=\"500\" height=\"301\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2009\/04\/concurrent.png 546w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2009\/04\/concurrent-300x180.png 300w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><\/p>\n<p><em><span style=\"color: #999999;\"><span>(Im\u00e1genes extraidas del libro &#8216;Learning GNU Emacs&#8217;, 3rd Edition by Debra Cameron, James Elliot, Marc Loy. O&#8217;Reilly)<\/span><\/span><\/em><\/p>\n<p>Por lo que puede existir alg\u00fan problema durante los procesos de check in debemos intentar resolverlos mediante <strong>M-x vc-resolve-conflicts<\/strong>. A partir de aqu\u00ed podemos comenzar a explicar las siguientes tareas t\u00edpicas y los keybindings asociados a un proceso general de desarrollo.<\/p>\n<p><strong>C-c C-c<\/strong>; commit del buffer comentado.<br \/>\n<strong>C-x v u<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-revert-buffer<\/span>&#8216;; revisa los cambios realizados desde el \u00faltimo check in.<br \/>\n<strong>C-x v c<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-cancel-version<\/span>&#8216;; cancela una revisi\u00f3n.<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Indicadores VC <\/strong><\/span><\/p>\n<p>En el modeline se pueden mostrar los siguientes indicadores:<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #008000;\">Si no muestra nada<\/span> <\/strong>indica que no se est\u00e1 bajo VC.<br \/>\n<span style=\"color: #993366;\"><span style=\"color: #008000;\"><strong>CVS-version<\/strong><\/span> <\/span>cambiado respecto al repositorio.<br \/>\n<strong><span style=\"color: #008000;\"><span><span>CVS<\/span>:<\/span>version<\/span><\/strong> cambios guardados pero no committeados.<\/p>\n<p>Adem\u00e1s debemos comprobar la variable &#8216;vc-handeled-backends&#8217; que revisa cu\u00e1l es el control de versiones disponible en el sistema que puede ser:<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #008000;\">comb<\/span><\/strong>: el control de versiones empleado en el sistema es <strong>SCCS<\/strong>.<br \/>\n<strong><span style=\"color: #008000;\">rcs<\/span><\/strong>: el control de versiones empleado en el sistema es <strong>RCS<\/strong>.<br \/>\n<strong><span style=\"color: #008000;\">cvs<\/span><\/strong>: el control de versiones empleado en el sistema es <strong>CVS<\/strong>.<br \/>\n<strong><span style=\"color: #008000;\">snv<\/span><\/strong>: el control de versiones empleado en el sistema es <strong>SNV<\/strong>.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Trabajando con grupos y directorios<\/span><\/strong><\/p>\n<p><strong>C-x v d<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-directory<\/span>&#8216;; configura dired para registrar ficheros bajo el directorio actual.<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Reporte de revisiones<\/strong><\/span><\/p>\n<p><strong>C-x v =<\/strong>; &#8216;<span style=\"color: #0000ff;\">vc-diff<\/span>&#8216;; configura dired para mostrar los diffs y presionando &#8216;<strong>g<\/strong>&#8216; refresca el estado de VC en el directorio.<br \/>\n<strong>C-u C-x v =<\/strong>; muestra el fichero y dos revisiones para reportar diffs entre dichas versiones del fichero.<br \/>\n<strong>C-x v ~<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-version-other-window<\/span>&#8216;; realiza la revisi\u00f3n de cualquier fichero guardado.<\/p>\n<p>Si estamos en foo.c y pulsamos <strong>C-x v ~ 1.3<\/strong> abrir\u00e1 el fichero foo.c~1.3~ (es decir la version 1.3 de dicho fichero).<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Historial de cambios<\/strong><\/span><\/p>\n<p><strong>C-x v l<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-print-log<\/span>&#8216;; muestra cambios en el historial y changelog.<br \/>\n<strong>C-x v a<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-update-change-log<\/span>&#8216;; actualiza el fichero changelog al estilo GNU.<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Registrando un fichero<\/strong><\/span><\/p>\n<p><strong>C-x v i<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-register<\/span>&#8216;; registrar un fichero en el control de versiones.<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Insertando cabeceras del control de versiones<\/strong><\/span><\/p>\n<p><strong>C-x v h<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-insert-headers<\/span>&#8216;; inserta cabeceras de control.<\/p>\n<p>Adem\u00e1s existe la variable &#8216;<strong>comment-start<\/strong>&#8216; y &#8216;<strong>comment-end<\/strong>&#8216; que puede tomar uno de estos tres valores: <strong>nroff<\/strong>, <strong>troff<\/strong>. <strong>groff<\/strong>.<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Creando y recuperando snapshots<\/strong><\/span><\/p>\n<p><strong>C-x v r<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-retrieve-snapshot<\/span>&#8216;; hace check out del snapshot del proyecto de desarrollo o lo que es lo mismo, asocia un nombre un snapshot nuevo.<br \/>\n<strong>C-x v s<\/strong>: &#8216;<span style=\"color: #0000ff;\">vc-create-snapshot<\/span>&#8216;; crea un nuevo snapshot del proyecto de desarrollo.<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Renombrando ficheros<\/strong><\/span><\/p>\n<p>&#8216;<strong>vc-rename-file<\/strong>&#8216;; dicha funci\u00f3n renombra un fichero bajo el control de versiones. Aunque en algunos controles de versiones da problemas, por lo que si ocurre debemos realizar de nuevo la acci\u00f3n limpiando la cache mediante &#8216;<strong>vc-clear-context<\/strong>&#8216;.<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Configurando VC <\/strong><\/span><\/p>\n<p>Las siguientes <strong>variables <\/strong>pueden modificarse para alterar el funcionamiento y configuraci\u00f3n de VC:<\/p>\n<p>&#8216;<strong>vc-display-backends<\/strong>&#8216;; maneja el control de versiones usado por VC.<br \/>\n&#8216;<strong>vc-display-status<\/strong>&#8216;; muestra el n\u00famero de revisi\u00f3n y su estado.<br \/>\n&#8216;<strong>vc-backend-header<\/strong>&#8216;; contiene un listado de cabeceras dado por la variable &#8216;<strong>vc-cvs-header<\/strong>&#8216;, etc.<br \/>\n&#8216;<strong>vc-keep-workfiles<\/strong>&#8216;; evita tener que hacer check out cada vez.<br \/>\n&#8216;<strong>vc-mistrust-permissions<\/strong>&#8216;; si se pone a &#8216;<strong>t<\/strong>&#8216; le indica a VC que no confie en los permisos del fichero local, sino en los del control de versiones.<br \/>\n&#8216;<strong>vc-suppress-confirm<\/strong>&#8216;; si se pone a &#8216;t&#8217; elimina la confirmaci\u00f3n para &#8216;<strong>vc-revert-buffer<\/strong>&#8216;.<br \/>\n&#8216;<strong>vc-initial-comment<\/strong>&#8216;; comentario inicial cuando se muestra un fichero (opcional) por los controles de versiones.<br \/>\n&#8216;<strong>vc-switches<\/strong>&#8216;; puede tomar 2 valores:<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #008000;\">-c<\/span><\/strong> para cuando haga diff tenga un formato <strong>context-diff<\/strong>.<br \/>\n<strong><span style=\"color: #008000;\">-u<\/span><\/strong> para cuando haga diff tenga un formato <strong>unified-diff<\/strong>.<\/p>\n<p><span style=\"color: #ff6600;\"><strong>Extendiendo VC<\/strong><\/span><\/p>\n<p>Existen extensiones por ejemplo para <strong>ClearCase <\/strong>de <strong>IBM<\/strong>, llamada <strong>vc-clearcase<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Emacs provee de un front-end que agiliza el uso de control de versiones, dicha feature se llama VC (Version Control) y permite usar de forma generalizada distintos controles de versiones mediante una misma interfaz. Los controles de versiones soportados son SCCS, RCS, CVS, SVN, GIT y dem\u00e1s, aunque algunos de ellos no estan adaptados perfectamente [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[88,8,87,84,85,86,83,82],"class_list":["post-55","post","type-post","status-publish","format-standard","hentry","category-basic","tag-control-de-versiones","tag-emacs","tag-git","tag-rccs","tag-scs","tag-svn","tag-vc","tag-version-control"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/55"}],"collection":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=55"}],"version-history":[{"count":1,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/55\/revisions"}],"predecessor-version":[{"id":785,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/55\/revisions\/785"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=55"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=55"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=55"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}