interoperabilidade Git com um repositório Mercurial

votos
189

Eu uso GIT em um Mac. disse o suficiente. Eu tenho as ferramentas, eu tenho a experiência. E eu quero continuar a usá-lo. Não há guerras aqui ...

O problema é sempre com a interoperabilidade. A maioria das pessoas usam SVN, que é ótimo para mim. Git SVN funciona fora da caixa, e é uma solução sem frescuras. As pessoas podem continuar alegremente usar SVN e eu não perder meu trabalho e nem minhas ferramentas.

Agora ... Alguns caras vêm junto com Mercurial. Bem para eles: eles têm as suas razões. Mas eu não consigo encontrar nenhuma GIT HG out-of-the-box. Eu não quero mudar para HG, mas eu ainda preciso para interoperar com o seu repositório.

Qualquer um de vocês sabem uma solução simples para isso?

Publicado 19/05/2009 em 16:26
fonte usuário
Em outras línguas...                            


10 respostas

votos
111

Há um novo git-remote-hg que fornece suporte nativo:

apoio ponte em Git para Mercurial e Bazaar

Basta copiar git-remote-hg para o seu $ PATH, torná-lo executável, e é isso, sem dependências (exceto Mercurial):

git clone hg::https://www.mercurial-scm.org/repo/hg/

Você deve ser capaz de empurrar e puxar a partir dele como se fosse um repositório Git nativa.

Quando você empurra novas agências Git, bookmarks Mercurial será criado para eles.

Veja a wiki git-remote-hg para mais informações.

Respondeu 13/11/2012 em 03:52
fonte usuário

votos
105

Você deve ser capaz de usar hg-git .

hg clone <hg repository>

editar ~/.hgrce adicionar:

[extensions]
hgext.bookmarks =
hggit =

criar um marcador para que você terá um masterno git:

cd <repository>
hg bookmark -r default master

editar .hg/hgrcno repositório e adicionar:

[git]
intree = true

agora você pode criar o repositório git:

hg gexport

e você pode usar o diretório resultante como um clone git. puxando a partir mercurial seria:

hg pull
hg gexport

e empurrando para mercurial:

hg gimport
hg push

(Sim, você precisa usar hg com este fluxo de trabalho, mas a sua pirataria será tudo em git)

PS Se você tem um problema com esse fluxo de trabalho, por favor arquive um bug.

Respondeu 06/07/2009 em 22:06
fonte usuário

votos
57

Update a partir de junho de 2012. Atualmente, parece haver os seguintes métodos para Git / Hg interoperabilidade quando o desenvolvedor quer trabalhar do lado do git:

  1. Instale Mercurial ea extensão hg-git . Você pode fazer o último usando seu gerenciador de pacotes, ou com easy_install hg-git. Em seguida, certifique-se o seguinte em seu ~ / .hgrc:

    [extensions]
    hggit = 
    

    Você pode ver algumas referências que falam sobre especificando a bookmarksextensão aqui também, mas que foi construído em Mercurial desde v 1.8. Aqui estão algumas dicas sobre a instalação hg-git no Windows .

    Depois de ter hg-git, você pode usar comandos mais ou menos como Abderrahim Kitouni postadas acima . Este método foi refinado e refinado desde 2009, porém, e há um invólucro friendly: git-hg-novo . Este usa o diretório de nível superior como um diretório de trabalho tanto para Mercurial e Git, ao mesmo tempo. Ele cria um marcador Mercurial que ele mantém em sincronia com a ponta do defaultramo (sem nome) no repositório Mercurial, e ele atualiza uma filial local Git a partir desse marcador.

  2. git-remote-hg é um invólucro diferente, também baseado no Mercurialhg-gitextensão. Isto faz com que, adicionalmente, a utilização dosgit-remote-helpersprotocolos (daí o seu nome). Ele usa o diretório principal apenas para um diretório de trabalho Git; ele mantém seu repositório Mercurial nua. Ele também mantém um segundo repositório Git nua para fazer sincronização entre Git e Mercurial mais seguro e mais idiomaticamente gitlike.

  3. O git-hg roteiro (anteriormente mantido aqui ) utiliza um método diferente, com base hg-fast-exportna partir do projeto de fast-exportação . Como o método 2, isto também mantém um repositório Mercurial nua e um repositório adicional Git nua.

    Para puxar, esta ferramenta ignora bookmarks Mercurial e em vez disso importa todos os ramos Mercurial chamado em um ramo Git, e o padrão (sem nome) ramo Mercurial em mestre.

    Alguns comentários discute esta ferramenta como sendo HG> git apenas, mas alega ter se fundiram em git-> hg empurrar apoio em 07 de dezembro de 2011. Como eu explico em uma revisão dessas ferramentas , no entanto, a forma como esta ferramenta tenta implementar apoio impulso não parece ser viável.

  4. Há também um outro projeto chamado git-remote-hg . Ao contrário da versão listados acima, este não depende de hg-git, mas em vez acessa diretamente a API Mercurial Python. No momento, usando também exige uma versão corrigida do git. Eu não tentei isso ainda.

  5. Finalmente, Tailor é um projeto que de forma incremental converte entre uma variedade de VCSs diferente. Parece que o desenvolvimento deste não será continuado de forma agressiva.

O primeiro de três dessas abordagens parecia leve o suficiente para me convencer a investigar. Eu precisava ajustá-los em algumas maneiras de obtê-los para rodar em minha configuração, e eu vi algumas maneiras de ajustá-los ainda mais para melhorá-los, e então eu tweaked-los ainda mais para fazê-los se comportar mais como uns aos outros para que eu pudesse avaliar -los de forma mais eficaz. Então eu pensei que os outros possam gostaria de ter esses ajustes também, para fazer a mesma avaliação. Então, eu tenho feito um pacote fonte que lhe permitirá instalar minhas versões de qualquer um dos três primeiras ferramentas. Ele também deve ter o cuidado de instalar os necessários hg-fast-exportpedaços. (Você precisa instalar hg-gitem seu próprio país.)

Encorajo-vos a experimentá-los e decidir por si mesmo o que funciona melhor. Eu vou ser feliz em ouvir sobre casos em que essas ferramentas quebram. Vou tentar mantê-los em sincronia com as mudanças a montante, e para certificar-se os autores a montante estão cientes dos ajustes que eu acho que são úteis.

Como eu mencionei acima, ao avaliar essas ferramentas, eu vim à conclusão de que git-hgsó é utilizável para puxar a partir Mercurial, não para empurrar.

Relacionado com isto, aqui estão algumas comparações úteis / manuais de tradução entre Git e Mercurial, em alguns casos, direcionados a usuários que já conhecem Git:

Respondeu 24/06/2012 em 16:31
fonte usuário

votos
15

Você pode tentar hg2git, que é script python e é parte de fast-exportação, que você pode encontrar em http://repo.or.cz/w/fast-export.git .

Você precisa ter mercurial instalado embora.

Respondeu 19/05/2009 em 16:39
fonte usuário

votos
9

Desde hg-git é um dois ponte de direcções, mas também irá permitir que você empurrar changesets de Git para Mercurial.

Respondeu 20/05/2009 em 22:34
fonte usuário

votos
6

Eu tenho tido grande sucesso com git-hga partir https://github.com/cosmin/git-hg (requer o trabalho de instalação de hg, também). Ele suporta buscar, puxar e empurrar e é mais estável para mim do que hg-git(características similares de hgpara git).

Veja https://github.com/cosmin/git-hg#usage para exemplos de uso. A interface de usuário é muito semelhante ao git-svn.

O git-hgrequer espaço extra em disco para cada repo hg clonado. A implementação usa clone mercurial completo, um clone nua git extra eo repo git real. O espaço em disco necessário é cerca de 3 vezes o git normal apenas uso. As cópias extras são armazenadas abaixo do .gitdiretório do seu diretório de trabalho (ou local apontado por GIT_DIRcomo de costume).

Aviso: O problema básico que git-hgtenta resolver é que não há nenhum mapeamento 1: 1 entre gite hgrecursos. O maior problema é a incompatibilidade de impedância entre os ramos git e ramos sem nome hg e HG ramos nomeados e bookmarks hg (todos aqueles parecem muito com ramos para gitusuários). Um problema relacionado é que hgtenta salvar nome original do ramo nomeado na história versão em oposição a git onde o nome de filial só é adicionado ao modelo de cometer mensagem por padrão.

Qualquer ferramenta que pretende criar ponte interoperáveis entre gite hgdeve explicar como ele vai lidar com este jogo impedância. Você pode então decidir se a solução escolhida se adapta às suas necessidades.

A solução que git-hgutiliza é descartar todos os marcadores de hg e converter ramos nomeados para o Git ramos. Além disso, define o branch master git para o padrão sem nome ramo hg.

Respondeu 27/06/2012 em 10:59
fonte usuário

votos
6

Hg-Git Mercurial Plugin . Ainda não tentei isso sozinho, mas pode valer a pena conferir.

Respondeu 19/05/2009 em 16:32
fonte usuário

votos
3

Tem hggit tentou. Funciona para mim, já que eu tenho que lidar o trabalho de git'ers e hg'ers. Especialmente para ser avaliado isso é ótimo.

Uma questão menor / aviso sobre o assunto:

Eu tentei para clonar um repositório do kernel linux estável com hg. Estes repositórios são mantidos em git e normalmente têm um grande número de arquivos nele.

Ele foi muito lento. Me levou 2 dias para clonar totalmente e atualizar uma cópia de trabalho.

Respondeu 04/08/2011 em 07:45
fonte usuário

votos
1

Eu tentei de cosmin git-hg e de abourget git-hg-again tanto no repo hg de vira-lata , parece que os aspectos mais tarde a ordem de uma fusão bem, o primeiro é um pouco aleatório. Você pode ver pelas imagens abaixo.

Um gráfico de histórico de vira-lata importado pelo git-hg de cosmin :

digite descrição da imagem aqui

Um gráfico de histórico de vira-lata importado por do abourget git-hg de novo :

digite descrição da imagem aqui

O gráfico história actuall traçado por hgk no repositório hg de vira-lata:

digite descrição da imagem aqui

Como você pode ver acima, o segundo gráfico, de abourget git-hg-novo é muito próximo ao gráfico hgk original e está realmente refletindo o fluxo de trabalho real da vira-lata.

Uma desvantagem de git-hg de novo eu encontrei é que ele não adiciona um 'hg' remoto, em vez importa todos os seus refs como marcas locais, git-hg tem uma maravilhosa 'hg' remota representa o repo hg upstream.

Respondeu 01/01/2014 em 18:51
fonte usuário

votos
0

Este é um velho perguntas, mas eu acho que vale a pena mencionar: bidirecional hg-git (e git-git, hg-hg) sync também é possível com o serviço Git-hg espelho . Ele usa hg-git (entre outros) nos bastidores e seu código também é open source.

Disclaimer: Eu sou da empresa por trás dele.

Respondeu 30/04/2017 em 16:36
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more