Mercurial es otro sistema de control de versiones distribuido (otro más) que no tiene nada (o poco) que envidiar a git (en lo referente a prestaciones) pero casi tan fácil de usar como subversion. Esta recetilla incluye unas nociones de su uso básico y algunas buenas referencias.

Introducción

Al igual que git, mercurial está muy influenciado por las ideas de monotone, pero al contrario que git, la gente de mercurial ha hecho algo de esfuerzo por no complicar demasiado su uso. El resultado es una mezcla de la facilidad de subversion con la potencia y posibilidades de git.

La siguiente figura es un esquema del funcionamiento de las órdenes más comunes:

Crear un repositorio

Partiendo de un directorio (vacío o no):

juan@example:~/iexplorer9$ hg init

si quieres añadir al repo lo que hubiera en ese directorio:

juan@example:~/iexplorer9$ hg add

Uso básico

Mercurial dispone de los comandos habituales en un VCS tradicional:

  • add
  • commit (ci)
  • update (up)
  • status (st)

Pero al ser mercurial un VCS distribuido, estas operaciones ocurren sobre un repositorio local. Para trabajar con un repositorio ajeno dispone de comandos similares a git:

  • clone
  • pull
  • push

Ver cambios respecto del repo master

  • incoming: cambios en el master que no están en tu copia
  • outgoing: cambios de tu copia que no están en el master

¿Qué es esto del merge?

Puede que te resulte raro ver un mensaje como este al hacer una operación pull o update:

$ hg pull -u
pulling from ssh://example.org//var/repo
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files (+1 heads)
not updating, since new heads added
(run 'hg heads' to see heads, 'hg merge' to merge)

Si compartes el repositorio con otras personas (que para eso está) es muy habitual que te encuentres con que varias personas han hecho cambios a partir de la misma versión. Otros programas, como subversion, mezclan automáticamente estos cambios. Si eso afectaba a las mismas líneas de un fichero, subversion decía que había un «conflicto» y marcaba sobre el propio fichero la zona afectada.

En mercurial esto es ligeramente distinto. Cuando hay más de un cambio sobre la última versión, se dice que hay varias «cabezas» (que se pueden ver con hg heads). Esas cabezas se pueden mezclar en una sola con:

$ hg merge
merging scripts/cv.py
3 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

Y tal como dice el aviso, debes hacer hg commit aunque lo hubieras hecho previamente, puesto que el merge cambia el contenido de los ficheros.

Clonar un repositorio remoto

Mercurial soporta varios protocolos: ssh, http(s), inotify. El siguiente comando clona un repositorio accesible por SSH:

bill@deathstar:~$ hg clone ssh://billy@example.org//home/juan/iexplorer9 micopia

Crear un repositorio compartido (al estilo CVS)

Necesitas crear un grupo UNIX y hacer que todos los usuarios que podrán utilizar el repositorio pertenezcan a dicho grupo.

# addgroup microchof
# adduser billy microchof
# adduser steve microchof

Luego crea un directorio e inicialízalo como repositorio mercurial:

# mkdir /var/hg/windows9
# cd /var/hg/windows9
# hg init

Después debes darle los permisos necesarios para que todos los usuarios del grupo puedan utilizarlo:

# chgrp -R microchof .hg
# chmod -R g+w .hg
# chmod -R g+s .hg

También es muy importante que el umask de los usuarios sea 002 o menos restrictivo. Puedes añadir la siguiente línea al /etc/profile:

umask 002

Referencias



blog comments powered by Disqus