Como migrar / converter de SVN para Mercurial (hg) no Windows


120

Estou procurando uma ferramenta para migrar alguns repositórios SVN para o Mercurial, com histórico, rótulos e assim por diante.

Estou usando o TortoiseHg (Windows x32), portanto, as ConvertExtensions são descartadas. Há algumas informações sobre como fazer esse processo em uma caixa Linux ( hgsvn ), mas não tenho uma máquina Linux disponível.

Posso usar esses scripts Python no Windows? Se sim, o que eu preciso fazer? Ou que outras ferramentas posso usar para fazer esse processo?

Basicamente, como posso converter um projeto SVN para Mercurial?

Respostas:


93

Eu apenas tive que resolver esse problema sozinho. Eu tenho uma máquina Windows XP com um servidor Windows separado que hospeda o VisualSVN Server .

Também tenho o TortoiseHG instalado, bem como o cliente de linha de comando do CollabNet Subversion .

<Enable Convert Extension w/ Tortoise Hg 2>

Muito obrigado a bgever por apontar nos comentários que com o TortoiseHg 2.0, ativar a extensão de conversão é mais fácil do que nunca. Como ele diz

Com o TortoiseHG 2.0, isso ficou muito mais simples: Inicie o TortoiseHG Workbench no menu Iniciar. Selecione Arquivo -> Configurações. Selecione Extensões na lista. Marque a caixa de seleção 'converter' e clique em OK. É isso aí! Não é mais necessário gerar o arquivo de configuração e pesquisá-lo no sistema de arquivos. - bgever 11/03 às 7:56

</Enable Convert Extension w/ Tortoise Hg 2>

<Enable Convert Extension Manually>

Para converter um repositório de SVN para HG, siga estas etapas:

1) Abra C: \ Arquivos de Programas \ TortoiseHg \ Mercurial.ini

EDITAR

FYI - Tortoise Hg migrou este arquivo para

  • XP ou mais antigo - C: \ Documents and Settings \ USERNAME \ Mercurial.ini
  • Vista ou posterior - C: \ Users \ USERNAME \ Mercurial.ini

Esse arquivo estará quase vazio e você apenas listará o que deseja substituir lá. Se é isso que você tem, basta adicionar essas duas linhas no final do arquivo:

[extensions]
convert =

2) Procure a linha que começa com

[extensões]

3) Abaixo, você verá uma lista de palavras-chave comentadas com ponto-e-vírgula (;) em cada linha

4) Encontre a linha que diz

; convert =

e exclua o ponto e vírgula para que ele leia

convert =

</Enable Convert Extension Manually>

5) Abra o prompt de comando e navegue até o diretório em que deseja que a nova pasta hg seja criada (o processo criará uma nova pasta chamada YOURSVNREPONAME-HG no diretório em que o prompt de comando está aberto).

6) Use este comando

arquivo de conversão hg: /// y: / oursvnreponame

Descobri que a ferramenta de conversão pode ter problemas com repositórios em rede, então tive que mapear uma unidade para ela, mas isso funcionou muito bem para mim.


Selecionar a resposta para esta pergunta foi difícil. evilbloodydemon estava certo quando comentou em sua resposta a editar a configuração para permitir a extensão convertido, mas esta resposta é mais claro e preciso
David Lay

1
Eu só queria mencionar que testei isso sem o cliente de linha de comando SVN e funcionou também. Você nem precisa de um servidor SVN funcionando para isso, basta acessar o caminho do arquivo do repositório.
227 Michael La Voie

Isso funcionou bem para mim com o Mercurial V1.4.3. Um repositório svn de 1 ano de idade foi convertido muito rapidamente com o histórico completo intacto. Muito Obrigado!
Jonathan Webb

1
Apenas para adicionar - o arquivo ini não é criado em uma instalação padrão do TortoiseHG. Você precisa aplicar / salvar algumas configurações primeiro ou começar com um arquivo em branco se souber o que está fazendo.
Ahmad

9
Com o TortoiseHG 2.0, isso ficou muito mais simples: Inicie o TortoiseHG Workbench no menu Iniciar. Selecione Arquivo -> Configurações. Selecione Extensões na lista. Marque a caixa de seleção 'converter' e clique em OK. É isso aí! Não é mais necessário gerar o arquivo de configuração e pesquisá-lo no sistema de arquivos.
Bart Verkoeijen 11/03/11

8
  1. servidor svn de inicialização no host local
  2. hg converter svn: // localhost / your_repo
  3. feito, porque as ligações svn são necessárias apenas para o arquivo: // protocolo

Não, nem os binários mercuriais para o win32 ou o TortoiseHg vêm com extensões de conversão, portanto, "hg convert" não é um comando válido no win32.
23419 David Lay

1
Eu tentei usar svn: // em vez de file: //, mas ele continua pedindo ligações Python
fglez

Usar svn: // em vez de file: // funcionou para mim sem as ligações do Python. Para iniciar o servidor svn, o comando é: svnserve -r <caminho para repo raiz> -d
Petter Wigle

7

2
Eu sei, é a primeira coisa que me deparei, mas citando: "Observe que você não pode fazer isso com os binários do Win32 Mercurial - não há como instalar as ligações do Subversion em sua biblioteca Python interna" Estou usando TortoiseHg ...
David Lay

Use um CD ao vivo do Linux ou uma máquina virtual?
richq

Esta é a resposta absolutamente correta. Eu fiz isso usando apenas a extensão hg convert ( selenic.com/mercurial/wiki/… ) e usando o protocolo de arquivo do repositório SVN sem a extensão pysvn: arquivo hg convert: /// X: / HOME / REPOS / mysvnrep newhgrep
van

5

Para converter um SVN Repo em um HG Repo E copiá-lo para um servidor diferente, você precisará de algumas coisas.

  1. TortoiseHG instalado. (Verifique para qual versão está sendo usada no momento)
  2. Python instalado. (Verifique para qual versão está sendo usada no momento)
  3. Os módulos Python (você pode encontrá-los http://pysvn.tigris.org/project_downloads.html )
  4. Você precisará adicionar a convertextensão ao Tortoise. Inicie o TortoiseHG Workbench no menu Iniciar. Selecione File -> Settings. Selecione Extensionsna lista. Marque a convertcaixa de seleção e clique em OK.

Primeiro a conversão…

  1. É melhor mapear a pasta em que o SVN Repo atual está localizado no computador em que você está trabalhando. (ou seja, \\server\folder não mapeie a própria pasta SVN Repo. Mapeie a pasta logo acima dela) Dê uma letra à unidade mapeada, comoY:\
  2. Abra um prompt de comando e digite: CD /D Y:\
  3. No Y:\prompt, digite: hg convert y:/RepoName (use o nome do repositório atual). Cuidado com as barras invertidas e traseiras. O comando está na barra. Além disso, se o nome tiver espaços, coloque-o entre aspas. (ie Y:/"My Repo folder")
  4. Agora ele deve estar em execução e criará outra pasta ao lado da antiga. E uma pasta hg deve estar dentro. NÃO SERÁ INICIADO E NÃO INICIARÁ!
  5. A conversão está completa.

Segundo a clonagem ...

  1. Abra o TortoiseHG Workbench. Vamos paraFile -> Clone Repository
  2. Origem: digite o caminho completo do repositório convertido.
  3. Destino: digite o caminho completo de onde você deseja que o repositório seja clonado. Não é necessário criar uma pasta no novo destino, pois o processo de clonagem a criará e inicializará.
  4. Adicione as permissões à nova pasta clonada.
  5. Você Terminou!!!

Oi, é possível explicar por que você não deve inito primeiro repositório?
Ben Page

3

Ninguém ainda não menciona o hgsubversion ( Extension Wiki ), que pode fazer isso sem quase nenhuma dor de cabeça (exceto casos raros e árvore específica).

Basta adicionar extensão, habilitá-lo e hg clone SVN_REPOao repositório mercurial local


1

Este é o FAQ do TortoiseHg :

Como posso converter um repositório do subversion para o Mercurial?

Você deve instalar as ferramentas de linha de comando svn-win32-1.4.6 e adicioná-las ao seu caminho. Então você deve habilitar a extensão convertida. Neste ponto, você deve poder usar o hg convertcomando ' ' para fazer a conversão. Encaminhe problemas / perguntas sobre a extensão convert à lista de email do Mercurial ou #mercurialem irc.freenode.net.

Portanto, é aparentemente possível - estou usando o Linux e não tentei.


0

Acabei de converter um repositório SVN remoto com autenticação HTTP em um repositório Mercurial, e deixe-me dizer, não há muita documentação sobre como fazer isso. Eu tive que baixar a fonte Mercurial e instalá-la autônoma, usando o pacote de fontes, para que as ligações do SVN funcionem da maneira correta.

Eu instalei como:

python setup.py install

O que funcionou muito bem na minha caixa do Server 2003. Agora posso converter um repositório SVN da maneira correta, fazendo algo assim:

python c:\python26\scripts\hg convert <remote repo>

A documentação para ConvertExtension no site Mercurial não é muito clara, mas diz o seguinte:

Não há como instalar as ligações do Subversion na biblioteca Python incorporada do [Mercurial's]. Então, você precisará usar um Mercurial instalado em cima de um Python independente

Então agora eu apenas uso a versão autônoma para a conversão e o TortoiseHg para o trabalho real do VCS.


0

Antes tarde do que nunca ...

Duas respostas pelo preço de uma ...

  1. Se for um repositório público de código aberto, você pode usar http://svn2github.com/add/, que demorou cerca de meia hora para clonar esse repositório no GitHib e, em seguida, simplesmente puxá-lo para o Hg.

  2. A vantagem de usar hg converté que pode ser retomada. Converter SVN em Hg pode levar dias . Se você parar com isso, ele será retomado de onde parou.

Abaixo está um arquivo em lotes que eu escrevi porque o Codeplex SVNbridge é um lixo. O repositório neste exemplo levou alguns dias para buscar toda a história (estou na Austrália, portanto a latência pode ter sido um fator). Eu gostaria de pensar que deu a um servidor TFS em algum lugar uma boa surra.

Esse arquivo em lote pode ser executado a qualquer momento para obter atualizações da fonte SVN, se forem as únicas restantes no mundo que ainda estão usando o SVN. Eu não testei, então veja o que acontece se você fizer isso. Se eu fosse você, abandonaria a ramificação original se você for editar o repositório.

O robocopy shamapmaterial é manter o histórico do SVN se você clonar o repositório Hg, o shamap é efêmero - verifique o arquivo em lotes e o shamap (eu faria isso em uma nova ramificação).

o lote ...

@echo off
mode con:cols=100 lines=800

:: Change the SVN remote name here
::
set remote=https://cinch.svn.codeplex.com/svn
::

title Fetching SVN from %remote%. This could take...DAYS
echo .
echo Fetching SVN checkins from %remote%
echo .
echo Dependencies: Tortoise Hg and hg.exe in the Path would be ideal.
echo using hg convert
echo .
echo First, I will make a backup of shamap in the hg repo folder.
echo If shamap in .hg\ is newer then it will be copied to the repo.
echo You should commit it so hg clones of this repo work with this.
echo Commit this .BeeyATch file as well.
echo shamap keeps track of what has been fetched from SVN.
echo ok, that ends the educational part of this script...
echo Now I will fetch SVN changes from
echo %remote%
echo ...
echo ...(this could take quite some time)...
echo ...DAYS...yes...DAYS
echo ...especially if it's fecking Codeplex SVN...
echo .
echo If this craps out just run it again - it will resume from where it left off. 
echo and fetch the rest...eventually
echo .
echo Control C to abort or any other key to start:
echo .

pause

echo .
:: http://mercurial.selenic.com/wiki/ConvertExtension <== see for details of shamap
:: copy the shamap from the original convert into the .hg folder unless it is already there & newer
:: don't panic if shamap is much bigger than the original - diff it to see why
robocopy .\ .\.hg\ shamap /XO 
robocopy .\.hg\ .\ shamap /XO 
echo .

hg convert --verbose --debug %remote% "%CD%"
echo .
echo .
echo Finished fetching from %remote%
title Finished fetching from %remote%
echo Any  key to Exit
echo .
pause

exit

0

Usando a convertextensão do Mercurial:

  1. Ativar extensão de conversão; adicione convert=à [extensions]seção .hgrc assim:

    [extensões]
    convert =

  2. O Linux precisa de ligações python adicionais: sudo apt-get install python-subversion
  3. Executar hg convertcomando
    • Veja hg convert -hpara ajuda
    • Exemplo: hg convert http://[svnserver]/[Project] --source-type svn [DestinationDir] (ver nota 2)
  4. Envie para o repositório Mercurial recém-criado: hg push https://[mercurialserver]/[Project]

nota : você pode até repetir o comando hg convert para incluir novas alterações feitas no repositório svn após a conversão anterior.

Nota 2 : Quando hg convertido não funciona usando http://ou svn://você pode primeiro fazer o checkout do repositório Subversion (ou atualizar um já existente) e convertido utilizando o check-out local; exemplo:hg convert [DirectoryOfLocalCheckout] --source-type svn [DestinationDir]

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.