Mercurial para iniciantes: o guia prático definitivo


237

Inspirado pelo Git para iniciantes: o guia prático definitivo .

Esta é uma compilação de informações sobre o uso do Mercurial para iniciantes para uso prático .

Iniciante - um programador que tocou no controle de origem sem entendê-lo muito bem.

Prático - cobrindo situações que a maioria dos usuários geralmente encontra - criando um repositório, ramificando, mesclando, puxando / empurrando de / para um repositório remoto, etc.

Notas :

  • Explique como fazer algo e não como algo é implementado.
  • Lide com uma pergunta por resposta.
  • Responda de forma clara e concisa possível.
  • Edite / estenda uma resposta existente em vez de criar uma nova resposta sobre o mesmo tópico.
  • Forneça um link para o wiki Mercurial ou o HG Book para pessoas que desejam aprender mais.

Questões:

Instalação / Configuração

Trabalhando com o código

Etiquetagem, ramificação, lançamentos, linhas de base

De outros

Outras referências mercuriais

Respostas:


16

Como você o configura para ignorar arquivos?

Ignorar é configurado em um arquivo de texto normal chamado .hgignore na raiz do seu repositório. Adicione-o como um arquivo normal com:

hg add .hgignore

Existem duas opções de sintaxe disponíveis para correspondência de arquivos, glob e regexp. glob é expansão de nome de arquivo semelhante ao unix e regexp é expressões regulares. Você ativa cada um adicionando syntax: globou syntax: regexpem uma linha por si só. Todas as linhas a seguir que usarão essa sintaxe até o próximo marcador de sintaxe. Você pode ter quantos marcadores de sintaxe desejar. A sintaxe padrão é regexp; portanto, se você usar apenas regexp, não precisará de nenhum marcador de sintaxe.

Você pode adicionar comentários com #

Exemplo:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

Ignorar se aplica apenas a arquivos não gerenciados (ou seja, arquivos que ainda não estão registrados). Para ignorar arquivos que estão sob controle de versão, você pode usar as opções -I e -X.


7
Pode ser útil mencionar que, se você hg addignorou manualmente os arquivos, o Mercurial os rastreará. Por exemplo, se você tem um monte de arquivos, como deploy-test.conf, deploy-production.confetc, e não querem versão los (eles podem ter senhas em si), mas você fazer quer para a versão deploy-template.confque você pode simplesmente ignorar deploy*e adicionar manualmente deploy-templace.conf.
— Steve Losh

7

Como você vê o que não foi confirmado ou o status da sua base de código atual?

Para ver uma lista de arquivos que foram alterados:

$ hg status

Isso imprimirá cada arquivo que foi alterado juntamente com seu status, que pode incluir:

  • M- modificado. O arquivo foi alterado e as alterações não foram confirmadas.
  • A- Adicionado. O arquivo não foi rastreado antes, mas se você confirmar o Mercurial, ele começará a rastreá-lo.
  • R- Removido. O arquivo foi rastreado antes, mas se você confirmar, o Mercurial deixará de rastreá-lo nesta e em futuras confirmações.
  • ?- desconhecido. No momento, o arquivo não é rastreado pelo Mercurial. A confirmação não terá efeito a menos que você use hg addpara adicioná-lo.
  • !- Ausência de. O arquivo foi rastreado, mas o Mercurial não pode encontrá-lo na cópia de trabalho.

Para ver as alterações que foram realmente feitas nos arquivos:

$ hg diff

6

Como você cria um novo projeto / repositório?

$ hg init my-repository

5

Como faço para interagir com o Subversion?

Existem três maneiras:


A extensão convert irá clonar um repositório Subversion existente em um repositório Mercurial. Ele vem com o Mercurial. Funciona aproximadamente assim:

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

Por exemplo, isso irá pegar o tronco do repositório em cache do SixApart.

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

A extensão pode trazer novas revisões de um repositório Subversion para o Mercurial (um pouco como puxar). No entanto, ele não suporta tirar revisões do Mercurial e enviá-las de volta ao Subversion (sem push). [XXX: corrija isso se estiver errado] .


A extensão hgsubversion . É de muitas maneiras a solução mais sofisticada, pois usa a API do Subversion para se comunicar com o repositório do Subversion. Seu objetivo é se tornar a ponte hg-svn. Permite revisões completas das revisões (clone, puxar e empurrar). No entanto, até o momento em que este artigo foi escrito [XXX: Altere isso se / quando ficar incorreto] , ainda está em desenvolvimento e ainda não há lançamentos oficiais. Como conseqüência, ele funciona apenas com o Mercurial mais atualizado (1,3 até o momento).

  • Ele mapeia tags e ramificações (precedendo todas as tags com tags/para distingui-las das ramificações com nomes equivalentes).
  • Ele mantém uma ramificação especial closed-branchespara fechar ramificações removidas no Subversion.
  • Ele exige que o Subversion Repository ser definido de acordo com a convenção de tronco / ramos / tags.
  • O conjunto de comandos normalmente é destinado hg svn <subcommand>a ser integrado ao ponto em que você não precisa da parte 'svn' (isto é, deseja tratar o clone do Subversion o máximo possível, como qualquer outro repositório Mercurial) .;

Funciona assim:

clone:

hg svnclone <Subversion URL> 

OU (apenas para svn://URLs)

hg clone <svn:// URL>

puxar:

hg svn pull

empurrar:

hg svn push

entrada:

hg svn incoming

extrovertido:

hg svn outgoing

Verificando um repositório inteiro:

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

O utilitário hgsvn ( árvore de bitbucket ). Até recentemente, isso só permitia clonar e extrair um repositório do Subversion, mas, a partir hgsvn 0.1.7dele, suporta push. [Eu não sei o quão bem ele empurra. Qualquer pessoa com mais experiência deve atualizar isso.] Ele possui os seguintes recursos notáveis:

  • Ele gera uma tag Mercurial para cada tag SVN.
  • Ele coloca uma tag local em cada conjunto de alterações para marcar sua revisão SVN.
  • Ele coloca todas as revisões do Mercurial em uma ramificação nomeada em homenagem a sua ramificação SVN. Por exemplo, branches/some-featureseria como hg branch some-feature. Coloca o tronco trunk(ou seja, nada está no ramo padrão do Mercurial, a menos que o usuário mude explicitamente).
  • Ele tentará identificar ramos e tags e criá-los, mas se não puder, apenas os ignora. Isso é útil quando o repositório do Subversion não segue o layout convencional de trunk / branches / tags.

Funciona assim:

clone:

hgimportsvn <Subversion URL>

puxar:

hgpullsvn

empurrar:

hgpushsvn

entrada:

hgpullsvn -n

extrovertido:

hgpushsvn -n

Verificando um repositório inteiro:

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

Verificando apenas o tronco:

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

2
Acabei de usar hg converte realmente leva muito tempo quando você tem um repositório svn com muitos commits. A configuração de um repositório local com svnsyncajuda muito a acelerar as coisas - especialmente quando você precisa fazer isso várias vezes, porque você tinha algumas opções erradas no comando convert.
— 21411 Debilski

Eu acho que todos esses métodos são mais rápidos se você tiver uma cópia local do repositório SVN. Mas você nem sempre pode acessar o repositório completo, certo? Eu pensei que svnsyncprecisava acessar os arquivos reais do repositório, não apenas o URL.
— quark

Observe que o hgsvn agora está no modo de manutenção , portanto não está mais sendo desenvolvido ativamente. Eles recomendam o uso do hgsubversion.
— Jon L.

5

Como você compara duas revisões de um arquivo ou seu arquivo atual e uma revisão anterior?

Ambos usam hg diff. Quando hg diffé usado, todas as alterações na cópia de trabalho e a dica (a confirmação mais recente) são exibidas.

Para "Como você compara duas revisões de um arquivo?"

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

O comando acima mostrará diferentes entre rev1 e rev2 de "file.code".

Para "Como você compara seu arquivo atual e uma revisão anterior?"

$ hg diff {file.code}

O comando acima mostrará diferentes entre a versão atual do "file.code" e a última revisão (a última confirmada).

: D


4

Como você 'marca' 'marca' ou 'libera' um conjunto específico de revisões para um conjunto específico de arquivos, para que você possa fazer isso posteriormente mais tarde?

$ hg tag my-tag

Você também pode clonar seu repositório para criar um repositório de tags especial .

$ hg clone working-repository my-tag-repository

3
Por que não hg tag my-tag?
— Steve Losh

4

Como você se ramifica?

Filial $ hg minha filial

ou

$ hg clone repositório original my-branch

Embora seja necessário observar que o branch cria um diretório "virtual" (ou seja, os arquivos permanecem os mesmos, mas o hg os trata como se fossem diferentes dentro do sistema), enquanto o clone cria uma cópia completa e real. A rigor, o clone não está se ramificando.


4
Essa é a maneira mais pesada que as pessoas idiotas sempre tiram sarro das pessoas do Mercurial por recomendá-las. Uma maneira mais leve, mais familiar para iniciantes seriahg branch my-branch
— Steve Losh

8
Você deve observar que essas são duas operações completamente diferentes.
— stepancheg

2
Eu encontrei este guia que poderia ser útil para ramificação em Mercurial: stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
— mbillard

Por ramos leves em hg que não são permanentes (como o ramo hg) utilizar o marcador mercuriais extensão
— Hultqvist

O artigo vinculado pelo GoodEnough fornece outro método leve usando indicadores. Parece muito bom para alterações que não são significativas para merecer seu próprio ramo
— Casebash

4

Bom plugin GUI / IDE para o Mercurial?

GUI

  • TortoiseHg para praticamente qualquer sistema operacional. Inclui integração com o Windows Explorer. Também funciona no Linux e em alguns outros sistemas operacionais, incluindo o Max OS X. Ele possui uma interface um pouco desajeitada e é um pouco complicado de usar no começo, mas é muito completo e poderoso.
  • O Murky é executado no Mac OS X 10.5 ou posterior. O Murky é bom para explorar o repositório e os comandos básicos, mas você também precisará saber como usar a linha de comando.
  • O MacHg é um bom Mac OS X Gui que possui um pouco mais de funcionalidade e polimento do que o Murky, mas você ainda precisará da linha de comando com ele.
  • O SourceTree é originalmente um cliente Mac, com uma versão do Windows disponível recentemente. Uma interface bastante agradável (pelo menos no OS X), suporta a maioria dos recursos Hg, incluindo arquivar.

Plugins


3

Como você confirma alterações?

Chame este comando do repositório local * mercurial atual

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

aliases: ci

  • Um repositório mercurial local possui .hg dentro do diretório atual

Onde a opção pode 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

Um exemplo de comando seria:

hg commit -m "added readme" README

NOTAS :

  • Se uma lista de arquivos for omitida, todas as alterações relatadas por "hg status" serão confirmadas.
  • Se você estiver confirmando o resultado de uma mesclagem, não forneça nenhum nome de arquivo ou filtro -I / -X.
  • Se nenhuma mensagem de confirmação for especificada, o editor configurado será iniciado para solicitar uma mensagem.

3

Como configurar o Mercurial?

O Mercurial armazena suas informações de configuração nos ~/.hgrcsistemas * nix e nos %UserProfile%\mercurial.inisistemas Windows. ( %UserProfile%normalmente "C:\Documents and Settings\[username]\"em sistemas Windows 2000 ou Windows XP e normalmenteC:\Users\[username]\ Windows Vista e Windows 7).

Como ponto de partida, você deve definir seu nome de usuário do Mercurial colocando o seguinte em seu .hgrcou mercurial.ini:

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <email.address@example.net>

Usuários do TortoiseHg em sistemas Windows podem executar alternativamente hgtk userconfig

Consulte também " Criando um arquivo de configuração do Mercurial " no capítulo 2 de " Mercurial: o guia definitivo ".


3

Como você mescla ramificações?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary

Como um novo usuário mercurial e como alguém novo no controle de revisão de origem em geral, eu realmente não entendo essa resposta. Você poderia esclarecer e expandir sua postagem? Ainda não entendi bem como usar o comando mesclar.
— Jamin Gray

3

Como instalar o Mercurial?

Edite bem se você instalou a partir da fonte no Linux ou usou os instaladores do Windows.

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

Use o easy_install do Python (com Setuptools ):

sudo easy_install mercurial

Ele encontra a versão mais recente (1.3.1 no momento da redação) e é instalada em:

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

Com o Python 2.6, isso também contorna o pacote de instalação do Mercurial OS X (na 1.2.1 em 26 de julho de 2009), reclamando que ele precisa do Python 2.5. A partir da documentação , parece que o Fink e o Macports instalam a versão 1.2.

Linux

A maioria dos pacotes Linux explícitos parece ficar para trás da versão atual; portanto, use easy_install (como acima) ou faça o download do pacote Mercurial , extraia o arquivo morto, mude para o diretório mercurial e execute:

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

(do Introducing Mercurial, um sistema de controle de versão distribuído )

janelas

Há um pacote binário da versão mais recente do Mercurial . TortoiseHg é uma extensão de shell do Windows para e instala o Mercurial. Cygwin também pode instalar o Mercurial.

Como alternativa (instruções muito longas, então linkadas aqui), você pode criar uma versão otimizada ou pura do Mercurial para Python .


1
Para criar mercurial a partir da fonte, será necessário os cabeçalhos do Python. Instale python-dev ou python-devel para aqueles que usam distribuições orientadas a pacotes.
— Nicolas Dumazet 11/11/2009

3

Como você obtém o código mais recente?

O Mercurial lembra de onde um repositório foi clonado (em .hg / hgrc) para que você possa simplesmente executar:

hg pull

para extrair o código mais recente do repositório de origem. (Isso não atualiza o diretório de trabalho)

hg update

para atualizar o diretório de trabalho.

hg pull -u

para executar um pull e uma atualização de uma só vez.


1
A origem é registrada .hg/hgrcquando você faz um clone, para que você não precise especificá-lo ao puxar / empurrar. Você pode adicionar mais caminhos à [paths]seção, .hg/hgrcse desejar.
— Martin Geisler

3

Como você verifica o código?

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

Onde a opção pode 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

Onde source é a origem dos arquivos originais localizados no repositório, onde pode ser um URL remoto ou um diretório do sistema de arquivos. Por exemplo:

E o destino é onde o código fonte estará localizado no seu sistema de arquivos local.


1

Como você confirma alterações?

$ hg commit -m "Commit message"

1

Como você vê quais alterações serão enviadas ao repositório upstream quando você pressiona?

Use hg outgoingpara obter a lista de conjuntos de alterações que serão configurados para o repositório padrão:

$ hg outgoing

Para obter as alterações reais do código, use -p( --patch). Isso produzirá cada conjunto de alterações na íntegra:

$ hg outgoing -p

1

Como você remove um arquivo do repositório?

Para remover um arquivo do repositório e excluí-lo no próximo commit:

$ hg remove {file(s)}

Para remover um arquivo do repositório, mas não o excluir

$ hg remove -Af {file(s)}

ou do Mercurial 1.3

$ hg forget {file(s)}

1

Como você volta para uma versão anterior do código?

A partir desta pergunta

$ hg update [-r REV]

@van: Se mais tarde você confirmar, criará efetivamente um novo ramo. Em seguida, você poderá continuar trabalhando apenas neste ramo ou, eventualmente, mesclar o existente.


1

Como você reverte um Changeset?

Algumas opções disponíveis

Easy Way (faça o backup de um único conjunto de alterações)

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

Hard Way (difere e aplique manualmente)

Etapa 1 : Crie um arquivo de correção para reverter o que mudou entre as revisões 107 e 108:

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

(alternativamente, hg diff -r108 -r107 sem --reverse fará a mesma coisa)

Etapa 2 : aplique o arquivo de correção:

patch -p1 < revert-change.patch

Algumas das diferenças podem falhar na aplicação, por exemplo:

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

O arquivo .rej conterá o conteúdo do diff que não foi aplicado. Você precisará dar uma olhada.


1
Não hg backouté para isso que serve?
— Wim Coenen

Sim, no entanto, o hg backout suporta apenas uma única identificação do conjunto de alterações para o backout. Definitivamente deve ser mencionado, vou atualizar de acordo
— SLF

1

Como você vê o histórico de revisões em um arquivo ou repositório?

Para mostrar o histórico de revisões de repositórios ou arquivos inteiros

$ hg log {file(s)}

ou

$ hg history {file(s)}

E para ver a lista em ordem inversa

$ hg log -r:

1

Como você mescla partes de um ramo em outro ramo?

Habilite a extensão 'transplante' em seu arquivo .hg / hgrc

[extensions]
transplant=

Carregue o ramo de destino e transplante a revisão de destino.
por exemplo: revisão de seleção de cereja 81 do ramo 'foo' para o ramo atual

$ hg transplant -b foo 81

As versões mais recentes do Mercurial não precisam da extensão do transplante. Você pode usar o graftcomando interno para fazer o mesmo. hg help graftpara mais informações
— DOOManiac

1

Como você extrai um patch de um conjunto de alterações específico?

$ hg export -o patchfile changeset

Você pode importar isso para outra ramificação com:

$ hg import patchfile
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.