FAQ de Mercurial

This is an archived page. It's not actively maintained.

驴En qu茅 se diferencia Mercurial de CVS?

  • "En mucho". Deber铆as leer y comprender lo b谩sico de Mercurial antes de hacerte cargo de trabajo con Mercurial en el que tengas inter茅s.
  • Los cambios en Mercurial son at贸micos.
  • En Mercurial, el etiquetado es r谩pido y O(1).
  • Mercurial facilita a todos bifurcar el repositorio central (la orden es hg clone).
  • Con Mercurial tendr谩s un clon completo, totalmente armado y operacional del repositorio entero de Mozilla en tu disco duro. Puedes trabajar localmente y aplicarle cambios sin afectar a nadie m谩s. Para promocionar los cambios al repositorio principal, usa hg push.
  • Las colas de Mercurial (ingl茅s) pueden ayudarte a hacer malabarismos con los parches. Es como Quilt (ingl茅s). La idea tras Quilt es 茅sta:

    Los scripts permiten manejar una serie de parches manteniendo un registro de los cambios que hace cada parche. Los parches pueden ser aplicados, des-aplicados, refrescados, etc.

    El concepto filos贸fico clave es que tu salida principal son parches. No archivos ".c", no archivos ".h", sino parches. As铆 que los parches son el objeto de primera categor铆a aqu铆.

  • Cuando CVS encuentra conflictos al fusionar, pone marcadores de conflicto en tu archivo. Cuando Mercurial encuentra conflictos al fusionar, lanza un programa de fusi贸n (ingl茅s). Esto es como un dolor de cervicales.
  • En muchos casos en los que CVS act煤a por archivo o por directorio, Mercurial act煤a por repositorio. Por ejemplo, un solo conjunto de cambios de Mercurial puede contener archivos a muchos archivos a lo largo del 谩rbol.
  • Esperamos que Mercurial nos permita volver a pensar la manera en la que trabajamos. Los equipos e individuos deber铆an poder ramificar y fusionar mucho m谩s f谩cilmente - sin abrir incidencias para el equipo t茅cnico. La gente de fuera de la comunidad que sean desarrolladores experimentados deber铆an ser capaces de hacer cosas sorprendentes con esto. Las compa帽铆as que mantienen bifurcaciones de Mozilla deber铆an poder trabajar mejor, tambi茅n. Todo est谩 por ver, no obstante.

驴C贸mo instalo Mercurial?

Si usas apt-get, emerge, port, o yum para instalar software, lim铆tate a hacer lo normal. Si obtienes como resultado una versi贸n antigua (pre-1.0 -- compru茅balo con hg version), puedes actualizarlo usando easy_install como sigue (usando apt-get en este ejemplo):

sudo apt-get install python-setuptools python-dev build-essential
sudo easy_install -U mercurial

En caso contrario, los paquetes binarios de Mercurial (ingl茅s) est谩n hechos para ti. Revisa tambi茅n wikimo:Mercurial on Windows (ingl茅s).

Programa de fusi贸n

Tras instalar, elige un programa de fusi贸n (ingl茅s). En serio. Hazlo ahora. Si no lo haces, Mercurial elegir谩 uno por ti y te lo plantar谩 en tus narices cuando menos lo esperes.

Algo razonable para hacer es configurar ui.merge=internal:merge en el archivo de configuraci贸n de Mercurial (ver m谩s abajo), lo que hace que Mercurial intente fusionar los cambios y a帽adir los marcadores de conflicto (al estilo CVS) a los archivos que no pueda fusionar.

Puedes ver la lista de conflictos de fusi贸n buscando "merging ... failed!" en la salida de update.

Configuraci贸n

Deber铆as configurar Mercurial antes de descargar el c贸digo. Tu archivo de configuraci贸n de Mercurial (~/.hgrc) deber铆a tener al menos la siguiente configuraci贸n:

[ui]
username = Tu Nombre Real <user@example.com>
merge = tu-programa-de-fusi贸n

[diff]
git = 1

[defaults]
diff=-p -U 8

En Windows, estos valores se pueden a帽adir a C:\Archivos de Programa\Mercurial\Mercurial.ini. En los sistemas tipo Unix, deber铆a estar en tu archivo $HOME/.hgrc.

Puedes configurar el editor a usar para los mensajes de fusi贸n usando la opci贸n editor en la secci贸n [ui] o estableciendo la variable de entorno EDITOR.

驴C贸mo gestiona Mercurial los finales de l铆nea?

La versi贸n Windows de Mercurial no convierte autom谩ticamente los finales de l铆nea entre los estilos de Windows y Unix. Todos nuestros repositorios usan finales de l铆nea Unix. Necesitamos una manera de solucionar esto en Windows, pero de momento no sabemos c贸mo.

(驴Qu茅 tal si insertamos un control previo al commit que rechace los cambios que contienen CR con un mensaje de error informativo apropiado? Posiblemente querremos hacer excepciones para ciertos tipos de archivo (como poco, archivos binarios, por supuesto), pero podemos ajustar el control seg煤n consideremos necesario. Mercurial 1.0 a帽ade un control est谩ndar para esto en la extensi贸n win32text que podr铆amos usar/adaptar --jwatt).

驴C贸mo puedo...?

驴C贸mo puedo descargar Mozilla?

El desarrollo principal (trunk) de Mozilla 2 est谩 ubicado en http://hg.mozilla.org/mozilla-central/ . Revisa C贸digo fuente de Mozilla (Mercurial) para instrucciones sobre c贸mo descargar el c贸digo fuente de Mozilla 2 de Mercurial.

驴C贸mo puedo editar y actualizar archivos?

Puedes editar archivos a voluntad en el directorio de trabajo, exactamente igual que con CVS.

La orden com煤n para actualizar un 谩rbol es:

hg pull -u

No es posible actualizar s贸lo un directorio; tienes que actualizar el 谩rbol entero.

驴C贸mo detecto cambios y aplico parches en archivos?

  • hg diff muestra las diferencias del 谩rbol completo por defecto. Usa hg diff <dir> para ver las diferencias s贸lo del directorio dado. No olvides hacer hg add de cualquier archivo nuevo que est茅s a帽adiendo antes de generar el parche.
  • Si est谩s cambiando archivos binarios o renombrando archivos puedes querer usar parches al estilo git con hg diff -g para conservar ese tipo de informaci贸n en el parche.
  • Al aplicar un parche generado por Mercurial, usa patch -p1, no patch -p0 (esto se debe a un fallo de la salida del diff de Mercurial 鈥 se refiere a los directorios ficticios "a" y "b". No preguntes).
  • Si tienes un parche de estilo git con renombrados o cambios binarios puedes usar hg import --no-commit para aplicar el parche a tu 谩rbol o usar hg qimport para importar el parche en mq.

Las opciones de diff preferidas son hg diff -p -U 8 que incluye 8 l铆neas de contexto y muestra la funci贸n relevante del bloque. Puedes convertir estas opciones en predeterminadas en el archivo de configuraci贸n de Mercurial.

驴C贸mo aplico cambios?

Configuraci贸n necesaria

Antes de aplicar ning煤n cambio, a帽ade estas l铆neas a tu archivo ~/.hgrc:

[ui]
username = Tu nombre <tu.email@example.com>

Para subir los cambios a mozilla-central y otros repositorios alojados en mozilla tienes que tener acceso de escritura (committer), y debes editar el archivo (tu-ra铆z-hg-local)/.hg/hgrc (observa que 茅ste NO es tu ~/.hgrc) para a帽adir esta l铆nea:

[paths]
default = http://hg.mozilla.org/mozilla-central/
default-push = ssh://hg.mozilla.org/mozilla-central/

Tambi茅n tienes que decirle a SSH qu茅 nombre de usuario utilizar al conectar con hg.mozilla.org. 脡ste deber铆a ser el nombre de usuario asociado a tu cuenta LDAP en Mozilla. Puedes hacer esto bien complicando ligeramente la ruta de aplicaci贸n por defecto, o default-push, (convirti茅ndola en user@host.name@hg.mozilla.org) o bien a帽adiendo l铆neas a tu ~/.ssh/config:

Host hg.mozilla.org
User usuario@host.dominio

Comprueba lo que vas a aplicar

A continuaci贸n, para comprobar si realmente vas a aplicar los cambios que quieres aplicar (especialmente importante al hacer fusiones y otros cambios complejos):

hg status
hg diff

status muestra los archivos que han cambiado en tu directorio de trabajo comparado con lo que hay en tu repositorio (las revisiones padre, que puedes ver usando hg parents). hg diff muestra los cambios reales en esos archivos, como diffs unificados. Puedes a帽adir la opci贸n -U8 para ver m谩s contexto.

Aplica al repositorio local

Como siguiente paso, aplicar谩s tus cambios a tu repositorio local:

hg commit

Esto aplica los cambios informado por hg status. Puedes limitar la aplicaci贸n a archivos o directorios espec铆ficos usando hg commit nombres_de_archivo. Puedes aplicar los cambios en nombre de alguna otra persona usando hg commit -u "Alg煤n otro <algun_otro@example.com>". Revisa hg help commit para obtener m谩s detalles.

Comprueba lo que vas a subir

Antes de que subas (push), probablemente quieras comprobar qu茅 conjuntos de cambios se subir谩n. Puedes hacer esto usando la orden outgoing:

hg outgoing

Esto te dar谩 una lista de conjuntos de cambio que se subir谩n al repositorio remoto predeterminado. A帽ade un argumento de repositorio para ver los cambios salientes (outgoing) en ese otro repositorio.

Subir al repositorio central

Para subir esos cambios hasta el repositorio central:

hg push

Obtendr谩s un mensaje de error sin importancia cada vez que subas:

remote: Could not chdir to home directory聽: No such file or directory

Ign贸ralo sin m谩s.

驴C贸mo act煤o ante "abort: push creates new remote heads!"?

Hagas lo que hagas, no hagas 'push -f' como sugiere el mensaje (probablemente falle de todas formas, pero ni lo intentes).

Alguien ha subido nuevos cambios desde tu 煤ltima descarga. A continuaci贸n has aplicado tu parche localmente y est谩s intentando subir ese cambio al repositorio principal, el cual tiene un 煤ltimo cambio distinto de aqu茅l desde el que comenzaste.

Hay dos cosas que puedes hacer. La m谩s sencilla es fusionar tus cambios: ejecuta hg pull, luego hg merge. Resuelve cualquier conflicto que surja, y luego aplica la fusi贸n resultante: hg commit -m "Merge commit for bug 123456". Luego haz hg push normalmente. Esto tiene el desafortunado efecto colateral de dejar un feo cambio por fusi贸n en el historial de revisiones y, lo que es peor, har谩 tu parche m谩s dif铆cil de retrotraer si tuviste que resolver conflictos.

Sin embargo, es lo m谩s sencillo, y es muy seguro. Hay otra manera de afrontar el problema, pero es considerablemente m谩s arcana -- hay un arreglo/reemplazo en progreso.

Advertencia: Esta aproximaci贸n funciona casi bien, pero hay algunos informes de parches que han sido tragados en varias ocasiones. Toma precauciones para hacer copias de tus parches (quiz谩 obteniendo un diff: hg log -p -r 12345 para mostrar el parche de la revisi贸n 12345) hasta que est茅s seguro de que las cosas funcionan como esperas.

Lo m谩s avanzado que puedes hacer es importar el cambio en mq, extraerlo de la cola, actualizar, y volver a aplicarlo de nuevo antes de subirlo:

% hg log -l 5
415[tip]   d1accb6ee840   2008-04-30 09:57 -0700   vladimir
  b=430873; fast path drawImage with a canvas as source
414   3a3ecbb4873e   2008-04-30 09:55 -0700   vladimir
  cvs sync
% hg qimport -r 415
% hg qtop
415.diff
% hg qpop
Patch queue now empty
% hg pull -u
... varios mensajes de descarga/actualizaci贸n ...
% hg qpush
applying 415.diff
Now at: 415.diff
Corrige los conflictos seg煤n sea necesario; si has corregido alguno, ejecuta hg qrefresh primero
% hg qrm -r 415.diff
qrm -r significa "elimina este parche de mi cola, pero conserva la revisi贸n"
% hg log -l 5
verifica que el registro tiene buena pinta, con tu cambio arriba del todo
% hg push

Si ya has usado mq para gestionar tus parches, aseg煤rate de que descargas/actualizas justo antes de aplicar y subir tu parche. Si tienes problemas con lo anterior, no hay nada malo en hacer una fusi贸n simple como se ha descrito anteriormente.

驴C贸mo veo lo que har谩n estas 贸rdenes antes de ejecutarlas?

Si quieres ver lo que har谩 hg commit, ejecuta hg diff primero.

Si quieres ver lo que subir谩 hg push, ejecuta hg outgoing primero.

Si quieres ver lo que descargar谩 hg pull, ejecuta hg incoming primero.

Estos pares de 贸rdenes aceptan todos argumentos parecidos, y hay buenos motivos para ello. Es buena idea usarlos siempre mientras est谩s aprendiendo a usar Mercurial. E incluso una vez ya eres un experto, ejecutar siempre outgoing antes de push es una buena idea.

驴C贸mo puedo personalizar el formato de los parches que crea Mercurial?

Edita tu archivo ~/.hgrc y a帽ade unas l铆neas como 茅stas:

[defaults]
diff=-U 8 -p
qdiff=-U 8

[diff]
git=true

La secci贸n [defaults] afecta a la salida predeterminada de las 贸rdenes hg diff y hg qdiff. Las opciones se comportan igual que si estuvieran en la l铆nea de 贸rdenes. Prueba hg help diff para m谩s informaci贸n.

La secci贸n [diff] afecta a todos los parches generados por Mercurial, incluso aquellos generados para el uso interno de Mercurial. Necesitas llevar mucho m谩s cuidado con esto, pero se recomienda git=true. Sin 茅l, Mercurial no puede comparar (diff) archivos binarios y no lleva un registro del bit de modo de ejecuci贸n.

Revertir cambios

Revertir todo el 谩rbol a una revisi贸n buena conocida

Es f谩cil, tan f谩cil como usar un mazo. Pero normalmente es matar moscas a ca帽onazos.

$ hg pull -u
$ hg revert --all -r a0193d83c208       # usa aqu铆 la id de tu revisi贸n buena conocida
$ hg commit                             # S茅 educado, incluye la id de revisi贸n en tu mensaje acompa帽ando al cambio
$ hg push

Hay una alternativa m谩s precisa:

Revertir un 煤nico conjunto de cambios

Sup贸n que el conjunto de cambios f8f4360bf155 ha estropeado algo.

$ hg pull -u
$ hg backout f8f4360bf155               # usa la id de revisi贸n del cambio err贸neo aqu铆

Esto crea y aplica un nuevo conjunto de cambios que revierte todos los cambios en la revisi贸n.

Si ves este mensaje:

the backout changeset is a new head - do not forget to merge

Esto significa que necesitas fusionar, porque tu historial ahora tiene este aspecto:

   T脷 ---> o  9123b7791b52 - Kaitlin Jones <kaitlin@example.net> - Backed out changeset f8f4360bf155
           |
TRUNK ---> | o  4e5bfb83643f - Simon Montagu <smontagu@example.org> - imported patch 435856
           | |
           | o  6ee23de41631 - Phil Ringnalda <philringnalda@example.com> - Bug 438526 - Opening links w
           | |
           | o  22baa05d0e8a - Robert O'Callahan <robert@example.org> - Remove DOM testcase from exclusi
           | |
           | o  c1aec2094f7e - Robert Longson <longsonr@example.com> - Bug 437448. New-style nsSVGString
           | |
           | o  306726089e22 - Robert Longson <longsonr@example.com> - Bug 437448. New-style nsSVGString
           | |
           | o  ba9b9a7c52a5 - Robert Longson <longsonr@example.com> - Bug 437448. New-style nsSVGString
           |/
           o  f8f4360bf155 - Robert O'Callahan <robert@example.org> - Bug 421436. Remove hack that gives
           |
           鈰 (the past)

Tu conjunto de cambios de reversi贸n est谩 basado en una revisi贸n antigua. No tiene los cambios m谩s recientes.

Maneja esto como cualquier otra fusi贸n. Si nunca has hecho antes una fusi贸n, consigue ayuda (podr铆a ser trivial o convertirse en un dolor de cabeza may煤sculo. Hay m谩s informaci贸n sobre c贸mo fusionar en otras partes de esta FAQ).

Ayuda

隆Ayuda, no puedo subir los cambios!

Si est谩s intentando subir los cambios y no puedes, prueba esto primero:

$ ssh hg.mozilla.org

Si ves un resultado como:

Permission denied (publickey,gssapi-with-mic).

puede deberse a las siguientes razones:

Si ves un resultado como:

You are not allowed to use this system, go away!

entonces necesitas cursar un bug en mozilla.org:Server Operations.

Debes esperar que la orden SSH te desconecte inmediatamente, ya que no se supone que debas tener acceso a ninguna shell. Puede que te devuelva como resultado:

Could not chdir to home directory聽: No such file or directory

lo que no tiene consecuencias (aunque algunas personas lo ver谩n y otras no).

Si ves un resultado como:

ssl required

entonces necesitas configurar el valor de tu default-push correctamente.

Cosas que han cambiado

  • Bonsai ha sido reemplazado por el visor web de Hg. Le faltan algunas caracter铆sticas de bonsai que estar铆an bien, incluyendo marcado, enlaces por n煤mero de l铆nea y gr谩ficas. Hay algunas diferencias de terminolog铆a:

bonsai blame == hg annotate
bonsai log == hg revisions
tambi茅n puedes visualizar el repositorio usando el enlace "manifest".

  • No hay integraci贸n de Bugzilla para Mercurial.