Mercurial para principiantes: la guía práctica definitiva

237

Inspirado por Git para principiantes: la guía práctica definitiva .

Esta es una recopilación de información sobre el uso de Mercurial para principiantes para uso práctico .

Principiante: un programador que ha tocado el control de fuente sin entenderlo muy bien.

Práctico: cubre situaciones que la mayoría de los usuarios encuentran a menudo: crea un repositorio, bifurca, fusiona, tira / empuja desde / hacia un repositorio remoto, etc.

Notas :

  • Explica cómo hacer algo en lugar de cómo se implementa algo.
  • Tratar con una pregunta por respuesta.
  • Responda con la mayor claridad y precisión posible.
  • Edite / extienda una respuesta existente en lugar de crear una nueva respuesta sobre el mismo tema.
  • Proporcione un enlace a la wiki de Mercurial o al Libro HG para las personas que desean obtener más información.

Preguntas:

Instalación / Configuración

Trabajando con el código

Etiquetado, ramificación, lanzamientos, líneas de base

Otro

Otras referencias mercuriales

Laz
fuente

Respuestas:

16

¿Cómo se configura para ignorar los archivos?

Ignorar está configurado en un archivo de texto normal llamado .hgignore en la raíz de su repositorio. Agréguelo como un archivo normal con:

hg add .hgignore

Hay dos opciones de sintaxis disponibles para la coincidencia de archivos, glob y regexp. glob es una expansión de nombre de archivo tipo Unix y regexp son expresiones regulares. Usted activa cada uno agregando syntax: globo syntax: regexpen una línea por sí mismo. Todas las líneas que siguen usarán esa sintaxis, hasta el siguiente marcador de sintaxis. Puede tener tantos marcadores de sintaxis como desee. La sintaxis predeterminada es regexp, por lo que si solo usa regexp no necesita ningún marcador de sintaxis.

Puedes agregar comentarios con #

Ejemplo:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

Ignorar solo se aplica a los archivos no administrados (es decir, archivos que aún no se registraron). Para ignorar los archivos que están bajo control de versión, puede usar los modificadores -I y -X.

Joakim Lundborg
fuente
77
Podría ser útil mencionar que si hg addignora manualmente los archivos, Mercurial los rastreará. Por ejemplo, si usted tiene un montón de archivos como deploy-test.conf, deploy-production.confno, etc., y hace falta para los versión (que podrían tener las contraseñas en ellos), pero que hacer desea versión deploy-template.confsólo se puede ignorar deploy*y añadir manualmente deploy-templace.conf.
Steve Losh
7

¿Cómo ves lo que no está comprometido o el estado de tu base de código actual?

Para ver una lista de archivos que han cambiado:

$ hg status

Esto imprimirá cada archivo que se haya cambiado junto con su estado, que puede incluir:

  • M- Modificado. El archivo ha sido modificado y los cambios no se han confirmado.
  • A- Adicional. El archivo no fue rastreado antes, pero si confirma Mercurial comenzará a rastrearlo.
  • R- Eliminado El archivo fue rastreado antes, pero si confirma Mercurial dejará de rastrearlo en este y futuros confirmaciones.
  • ?Desconocido Mercurial no rastrea actualmente el archivo. Comprometerse no tendrá ningún efecto a menos que lo uses hg addpara agregarlo.
  • !- Desaparecido. Se realizó un seguimiento del archivo, pero Mercurial no puede encontrarlo en la copia de trabajo.

Para ver los cambios que realmente se han realizado en los archivos:

$ hg diff
Steve Losh
fuente
6

¿Cómo se crea un nuevo proyecto / repositorio?

$ hg init my-repository

fuente
5

¿Cómo interactúo con Subversion?

Hay tres formas:


La extensión de conversión clonará un repositorio Subversion existente en uno Mercurial. Viene con Mercurial. Funciona más o menos así:

hg convert <Subversion URL or directory> <path to new Mercurial repository>

Por ejemplo, esto tomará el tronco del repositorio memcached de SixApart.

hg convert http://code.sixapart.com/svn/memcached/trunk

La extensión puede incorporar de forma incremental nuevas revisiones desde un repositorio de Subversion al Mercurial (un poco como pull). Sin embargo, no admite tomar revisiones de Mercurial y enviarlas de nuevo a Subversion (sin inserción). [XXX: corrígelo si está mal] .


La extensión hgsubversion . Es, en muchos sentidos, la solución más sofisticada, ya que utiliza la API de Subversion para comunicarse con el repositorio de Subversion. Su objetivo es convertirse en el puente hg-svn. Permiten una revisión completa de las revisiones (clon completo, extracción y empuje). Sin embargo, al momento de escribir esto [XXX: Enmendar esto si / cuando se vuelva incorrecto] todavía está en desarrollo y aún no hay lanzamientos oficiales. Como consecuencia, funciona solo con el Mercurial más actualizado (1.3 al momento de escribir este artículo).

  • Mapea etiquetas y ramas (precediendo a todas las etiquetas con tags/para distinguirlas de ramas con nombres equivalentes).
  • Mantiene una rama especial closed-branchespara cerrar las ramas que se eliminan en Subversion.
  • Se requiere que el repositorio de Subversion ser establecido de acuerdo a la convención del tronco / ramas / etiquetas.
  • El conjunto de comandos normalmente hg svn <subcommand>tiene como objetivo integrarse hasta el punto de que no necesita la parte 'svn' (es decir, quiere tratar un clon de Subversion tanto como sea posible como cualquier otro repositorio de Mercurial) .;

Funciona así:

clon:

hg svnclone <Subversion URL> 

O (solo para svn://URL)

hg clone <svn:// URL>

Halar:

hg svn pull

empujar:

hg svn push

entrante:

hg svn incoming

saliente:

hg svn outgoing

Verificando un repositorio completo:

hg svnclone http://code.sixapart.com/svn/memcached

La utilidad hgsvn ( árbol de bitbucket ). Hasta hace poco, esto solo le permitía clonar y extraer un repositorio de Subversion, pero a partir de hgsvn 0.1.7él admite la inserción. [No sé qué tan bien empuja. Cualquier persona con más experiencia debería actualizar esto.] Tiene las siguientes características notables:

  • Genera una etiqueta Mercurial para cada etiqueta SVN.
  • Pone una etiqueta local en cada conjunto de cambios para marcar su revisión SVN.
  • Pone cada revisión de Mercurial en una rama con nombre que lleva el nombre de su rama SVN. Por ejemplo branches/some-featuresería como hg branch some-feature. Pone el tronco trunk(es decir, no hay nada en la rama predeterminada de Mercurial, a menos que el usuario lo cambie explícitamente).
  • Intentará identificar ramas y etiquetas, y crearlas, pero si no puede, simplemente las omitirá. Esto es útil cuando el repositorio de Subversion no sigue el diseño convencional de troncales / ramas / etiquetas.

Funciona así:

clon:

hgimportsvn <Subversion URL>

Halar:

hgpullsvn

empujar:

hgpushsvn

entrante:

hgpullsvn -n

saliente:

hgpushsvn -n

Verificando un repositorio completo:

hgimportsvn http://code.sixapart.com/svn/memcached

Verificando solo el tronco:

hgimportsvn http://code.sixapart.com/svn/memcached/trunk
cuarc
fuente
2
Acabo de usar hg converty realmente lleva mucho tiempo cuando tienes un repositorio svn con muchas confirmaciones. La configuración de un repositorio local svnsyncayuda mucho a acelerar las cosas, especialmente cuando necesita hacerlo varias veces, porque tenía algunas opciones incorrectas en su comando de conversión.
Debilski el
Creo que todos estos métodos son más rápidos si tienes una copia local del repositorio SVN. Pero no siempre puedes acceder al repositorio completo, ¿verdad? Pensé que svnsyncnecesitaba acceder a los archivos reales del repositorio, no solo a la URL.
quark
Tenga en cuenta que hgsvn ahora está en modo de mantenimiento , por lo que ya no se está desarrollando activamente. Recomiendan usar hgsubversion en su lugar.
Jon L.
5

¿Cómo compara dos revisiones de un archivo, o su archivo actual y una revisión anterior?

Ambos usan hg diff. Cuando hg diffse utiliza todos los cambios en la copia de trabajo y se muestra la sugerencia (la última confirmación).

Para "¿Cómo se comparan dos revisiones de un archivo?"

$ hg diff -r{rev1} -r{rev2} {file.code}

El comando anterior mostrará diferentes entre rev1 y rev2 de "file.code".

Para "¿Cómo compara su archivo actual y una revisión anterior?"

$ hg diff {file.code}

El comando anterior mostrará diferentes entre la versión actual de "file.code" y la última revisión (la última comprometida).

:RE

NawaMan
fuente
4

¿Cómo 'marca' 'etiqueta' o 'libera' un conjunto particular de revisiones para un conjunto particular de archivos para que siempre pueda extraerlo más adelante?

$ hg tag my-tag

También puede clonar su repositorio para crear un repositorio de etiquetas especial .

$ hg clone working-repository my-tag-repository

fuente
3
¿Por qué no hg tag my-tag?
Steve Losh
4

¿Cómo se ramifica?

$ hg branch my-branch

o

$ hg clone repositorio original my-branch

Aunque debe tenerse en cuenta que la rama crea un directorio "virtual" (es decir, los archivos permanecen igual, pero hg los trata como si fueran diferentes dentro del sistema), mientras que el clon crea una copia real y completa. Estrictamente hablando, el clon no se ramifica.

Nick Hodges
fuente
44
Esta es la forma de peso pesado que las personas git siempre se burlan de las personas Mercurial por recomendar. Una forma más ligera y familiar para los principiantes seríahg branch my-branch
Steve Losh
8
Debe tener en cuenta que estas son dos operaciones completamente diferentes.
stepancheg
2
Encontré esta guía que podría ser útil para ramificar en Mercurial: stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
mbillard
Para las ramas ligeras en hg que no son permanentes (como la rama hg) use la extensión de marcadores mercurial
hultqvist
El artículo vinculado por GoodEnough proporciona otro método liviano utilizando marcadores. Parece bastante bueno para los cambios que no son significativos para merecer su propia rama
Casebash
4

¿Buen plugin GUI / IDE para Mercurial?

GUI

  • TortoiseHg para casi cualquier sistema operativo. Incluye integración de Windows Explorer. También funciona en Linux y algunos otros sistemas operativos: incluido Max OS X. Tiene una interfaz algo torpe y es un poco difícil de usar al principio, pero es muy completo y potente.
  • Murky se ejecuta en Mac OS X 10.5 o posterior. Murky es bueno para explorar el repositorio y los comandos básicos, pero también necesitará saber cómo usar la línea de comandos.
  • MacHg es un buen Mac OS X Gui que tiene un poco más de funcionalidad y pulido que Murky, pero también necesitará la línea de comandos con él.
  • SourceTree es un cliente Mac originalmente, con una versión de Windows disponible recientemente. La interfaz de usuario bastante agradable (al menos en OS X), admite la mayoría de las funciones de Hg, incluida la estantería.

Complementos

Macke
fuente
3

¿Cómo se comprometen los cambios?

Invoque este comando desde el repositorio mercurial local * actual

hg commit [OPTION]... [FILE]...

alias: ci

  • Un repositorio mercurial local tiene .hg dentro del directorio actual

Donde la opción puede ser:

 -A --addremove     mark new/missing files as added/removed before committing
    --close-branch  mark a branch as closed, hiding it from the branch list
 -I --include       include names matching the given patterns
 -X --exclude       exclude names matching the given patterns
 -m --message       use <text> as commit message
 -l --logfile       read commit message from <file>
 -d --date          record datecode as commit date
 -u --user          record user as committer

Un comando de ejemplo sería:

hg commit -m "added readme" README

NOTAS :

  • Si se omite una lista de archivos, se confirmarán todos los cambios informados por "hg status".
  • Si está confirmando el resultado de una fusión, no proporcione ningún nombre de archivo o filtros -I / -X.
  • Si no se especifica ningún mensaje de confirmación, el editor configurado se inicia para solicitarle un mensaje.
revs jpartogi
fuente
3

¿Cómo configurar Mercurial?

Mercurial almacena su información de configuración en ~/.hgrcsistemas * nix y en %UserProfile%\mercurial.inisistemas Windows. ( %UserProfile%normalmente "C:\Documents and Settings\[username]\"en sistemas Windows 2000 o Windows XP, y generalmente C:\Users\[username]\en sistemas Windows Vista y Windows 7).

Como punto de partida, debe establecer su nombre de usuario Mercurial colocando lo siguiente en su .hgrco mercurial.ini:

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <[email protected]>

Los usuarios de TortoiseHg en sistemas Windows pueden ejecutar alternativamente hgtk userconfig

Consulte también " Creación de un archivo de configuración de Mercurial " en el capítulo 2 de " Mercurial: la guía definitiva ".

las3rjock
fuente
3

¿Cómo se fusionan las ramas?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary
Martin Geisler
fuente
Como nuevo usuario mercurial, y como alguien nuevo en el control de revisiones de origen en general, realmente no entiendo esta respuesta. ¿Podrías aclarar y ampliar tu publicación? Todavía no entiendo cómo usar el comando de combinación.
Jamin Gray
3

¿Cómo instalar Mercurial?

Edite bien si ha instalado desde la fuente en Linux o ha utilizado los instaladores de Windows.

Mac OS X 10.4 (Tiger), 10.5 (Leopard)

Utilice easy_install de Python (con Setuptools ):

sudo easy_install mercurial

Esto encuentra la última versión (1.3.1 en el momento de la escritura) y se instala en:

/Library/Frameworks/Python.framework/Versions/2.6/bin/

Con Python 2.6, esto también evita el paquete de instalación de Mercurial OS X (en 1.2.1 a partir del 26 de julio de 2009) quejándose de que necesita Python 2.5. De la documentación , parece que Fink y Macports instalan la versión 1.2.

Linux

La mayoría de los paquetes explícitos de Linux parecen estar rezagados con respecto a la versión actual, así que use easy_install (como arriba) o descargue el tarball de Mercurial , extraiga el archivo, cambie al directorio mercurial y ejecute:

$ make
$ sudo make install    # do a system-wide install
$ hg debuginstall      # sanity check
$ hg                   # see help

(de Introducing Mercurial, un sistema de control de versiones distribuido )

Ventanas

Hay un paquete binario de la última versión de Mercurial . TortoiseHg es una extensión de shell de Windows para e instala Mercurial. Cygwin también puede instalar Mercurial.

Alternativamente (las instrucciones son demasiado largas y están vinculadas aquí), puede construir una versión optimizada o pura de Mercurial en Python desde la fuente.

Dave Everitt
fuente
1
Para construir mercurial desde la fuente, uno necesitará los encabezados de Python. Instale python-dev o python-devel para aquellos que usan distribuciones orientadas a paquetes.
Nicolas Dumazet
3

¿Cómo se obtiene el último código?

Mercurial recuerda dónde se clonó un repositorio (en .hg / hgrc) para que pueda simplemente ejecutar:

hg pull

para extraer el último código del repositorio de origen. (Esto no actualiza el directorio de trabajo)

hg update

para actualizar el directorio de trabajo.

hg pull -u

para realizar una extracción y una actualización a la vez.

Laz
fuente
1
El origen se registra .hg/hgrccuando hace un clon, por lo que no tiene que especificarlo cuando tira / empuja. Puede agregar más rutas a la [paths]sección .hg/hgrcsi lo desea.
Martin Geisler
3

¿Cómo verificas el código?

hg clone [OPTION]... SOURCE [DEST]

Donde la opción puede ser:

 -U --noupdate      the clone will only contain a repository (no working copy)
 -r --rev           a changeset you would like to have after cloning
    --pull          use pull protocol to copy metadata
    --uncompressed  use uncompressed transfer (fast over LAN)
 -e --ssh           specify ssh command to use
    --remotecmd     specify hg command to run on the remote side

Donde source es la fuente de los archivos originales ubicados en el repositorio, donde puede ser una URL remota o un directorio del sistema de archivos. Por ejemplo:

Y el destino es donde se ubicará el código fuente en su sistema de archivos local.

jpartogi
fuente
1

¿Cómo se comprometen los cambios?

$ hg commit -m "Commit message"
NawaMan
fuente
1

¿Cómo ve qué cambios se enviarán al repositorio ascendente cuando presiona?

Use hg outgoingpara obtener la lista de conjuntos de cambios que se establecerán en el repositorio predeterminado:

$ hg outgoing

Para obtener los cambios de código reales, use -p( --patch). Esto generará cada conjunto de cambios en su totalidad:

$ hg outgoing -p
robotadam
fuente
1

¿Cómo se elimina un archivo del repositorio?

Para eliminar un archivo del repositorio y eliminarlo en la próxima confirmación:

$ hg remove {file(s)}

Para eliminar un archivo del repositorio, pero no eliminarlo

$ hg remove -Af {file(s)}

o de Mercurial 1.3

$ hg forget {file(s)}
David Sykes
fuente
1

¿Cómo vuelves a una versión anterior del código?

De esta pregunta

$ hg update [-r REV]

@van: Si luego te comprometes, crearás una nueva rama de manera efectiva. Entonces puede continuar trabajando solo en esta rama o eventualmente fusionar la existente en ella.

David Sykes
fuente
1

¿Cómo se revierte un conjunto de cambios?

Un par de opciones disponibles

Easy Way (retroceder un solo conjunto de cambios)

$ hg backout -m 'back out second change' tip
reverting myfile
changeset 2:01adc4672142 backs out changeset 1:7e341ee3be7a
$ cat myfile
first change

Hard Way (diferir y aplicar manualmente)

Paso 1 : Cree un archivo de parche para revertir lo que cambió entre la revisión 107 y 108:

hg diff -r107 -r108 --reverse  > revert-change.patch

(alternativamente, hg diff -r108 -r107 sin --reverse hará lo mismo)

Paso 2 : aplique el archivo de parche:

patch -p1 < revert-change.patch

Algunas de las diferencias pueden no aplicarse, por ejemplo:

Hunk #3 FAILED at 517.
1 out of 3 hunks FAILED -- saving rejects to file 'foo/bar.c.rej'

El archivo .rej contendrá el contenido de la diferencia que no se pudo aplicar, deberá echar un vistazo.

revs slf
fuente
1
¿No es esto para lo que hg backoutsirve?
Wim Coenen
Sí, sin embargo, hg backout solo es compatible con un único ID de conjunto de cambios para retroceder. Definitivamente debería mencionarse, actualizaré en consecuencia
slf
1

¿Cómo ve el historial de revisiones de un archivo o repositorio?

Para mostrar el historial de revisión de todo el repositorio o archivos

$ hg log {file(s)}

o

$ hg history {file(s)}

Y para ver la lista en orden inverso

$ hg log -r:
David Sykes
fuente
1

¿Cómo fusionar partes de una rama en otra rama?

Habilite la extensión 'transplante' en su .hg / hgrc

[extensions]
transplant=

Cargue la rama objetivo y luego trasplante la revisión objetivo.
Por ejemplo: Cherry Pick revisión 81 de la rama 'foo' en la rama actual

$ hg transplant -b foo 81
John Mee
fuente
Las versiones más nuevas de Mercurial no necesitan la extensión de trasplante. Puede usar el graftcomando incorporado para hacer lo mismo. hg help graftpara más información
DOOManiac
1

¿Cómo se extrae un parche de un conjunto de cambios específico?

$ hg export -o patchfile changeset

Luego puede importar esto a otra rama con:

$ hg import patchfile
David Sykes
fuente