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

Laz
fonte

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.

Joakim Lundborg
fonte
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
Steve Losh
fonte
6

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

$ hg init my-repository

fonte
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
quark
fonte
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

NawaMan
fonte
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

fonte
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.

Nick Hodges
fonte
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

Macke
fonte
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.
jpartogi
fonte
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 protected]>

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 ".

las3rjock
fonte
3

Como você mescla ramificações?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary
Martin Geisler
fonte
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 .

Dave Everitt
fonte
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.

Laz
fonte
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.

jpartogi
fonte
1

Como você confirma alterações?

$ hg commit -m "Commit message"
NawaMan
fonte
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
robotadam
fonte
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)}
David Sykes
fonte
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.

David Sykes
fonte
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.

slf
fonte
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:
David Sykes
fonte
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
John Mee
fonte
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
David Sykes
fonte