Come migrare / convertire da SVN a Mercurial (hg) su Windows


120

Sto cercando uno strumento per migrare un paio di repository SVN su Mercurial, con cronologia, etichette e così via.

Sto usando TortoiseHg (Windows x32), quindi ConvertExtensions vengono scartate. Ci sono alcune informazioni su come eseguire questo processo su una macchina Linux ( hgsvn ), ma non ho una macchina Linux disponibile.

Posso usare quegli script Python su Windows? In caso affermativo, cosa mi serve per farlo? Oppure quali altri strumenti posso utilizzare per eseguire questo processo?

Fondamentalmente, come posso convertire un progetto SVN in Mercurial?

Risposte:


93

Dovevo solo affrontare questo problema da solo. Ho una macchina Windows XP con un server Windows separato che ospita VisualSVN Server .

Ho anche TortoiseHG installato e il client da riga di comando CollabNet Subversion .

<Enable Convert Extension w/ Tortoise Hg 2>

Mille grazie a bgever per aver sottolineato nei commenti che con TortoiseHg 2.0, abilitare l'estensione di conversione è più facile che mai. Come dice lui

Con TortoiseHG 2.0 questo è stato reso molto più semplice: avvia il TortoiseHG Workbench dal menu Start. Seleziona File -> Impostazioni. Seleziona Estensioni dall'elenco. Seleziona la casella di controllo "converti" e fai clic su OK. Questo è tutto! Non è più necessario provare a generare il file di configurazione e cercarlo nel file system. - l'11 marzo alle 7:56

</Enable Convert Extension w/ Tortoise Hg 2>

<Enable Convert Extension Manually>

Per convertire un repository da SVN a HG, ho seguito questi passaggi:

1) Apri C: \ Programmi \ TortoiseHg \ Mercurial.ini

MODIFICARE

Cordiali saluti, Tortoise Hg ha migrato questo file a

  • XP o precedente - C: \ Documents and Settings \ USERNAME \ Mercurial.ini
  • Vista o versioni successive - C: \ Users \ USERNAME \ Mercurial.ini

Quel file sarà per lo più vuoto e dovrai solo elencare ciò che desideri sovrascrivere lì. Se è quello che hai, aggiungi semplicemente queste due righe alla fine del file:

[extensions]
convert =

2) Cerca la riga che inizia con

[estensioni]

3) Sotto vedrai un elenco di parole chiave, commentate con un punto e virgola (;) su ogni riga

4) Trova la riga che dice

; convertire =

ed elimina il punto e virgola in modo che legga

convert =

</Enable Convert Extension Manually>

5) Apri il prompt dei comandi e vai alla directory in cui desideri creare la nuova cartella hg (il processo creerà una nuova cartella chiamata yoursvnreponame-hg nella directory in cui è aperto il prompt dei comandi).

6) Usa questo comando

hg convert file: /// y: / yoursvnreponame

Ho scoperto che lo strumento di conversione può avere problemi con i repository in rete, quindi ho dovuto mappare un'unità su di esso, ma ha funzionato bene per me.


Selezionare la risposta a questa domanda è stato difficile. evilbloodydemon aveva ragione quando ha commentato nella sua risposta di modificare la configurazione per abilitare l'estensione di conversione, ma questa risposta è più chiara e precisa
David Lay

1
Volevo solo menzionare che l'ho testato senza il client della riga di comando SVN e ha funzionato anche. Non è nemmeno necessario che un server SVN funzioni per farlo, basta accedere al percorso del file del repository.
Michael La Voie

Questo ha funzionato bene per me con Mercurial V1.4.3. Un repository svn di 1 anno è stato convertito molto rapidamente con l'intera cronologia intatta. Grazie molto!
Jonathan Webb

1
Solo per aggiungere: il file ini non viene creato su un'installazione TortoiseHG predefinita. Devi prima applicare / salvare alcune impostazioni o iniziare con un file vuoto se sai cosa stai facendo.
Ahmad

9
Con TortoiseHG 2.0 questo è stato reso molto più semplice: avvia il TortoiseHG Workbench dal menu Start. Seleziona File -> Impostazioni. Seleziona Estensioni dall'elenco. Seleziona la casella di controllo "converti" e fai clic su OK. Questo è tutto! Non è più necessario provare a generare il file di configurazione e cercarlo nel file system.
Bart Verkoeijen

8
  1. avvio del server svn su localhost
  2. hg convert svn: // localhost / your_repo
  3. fatto, perché i collegamenti svn necessari solo per file: // protocollo

No, né i binari Mercurial per win32 né TortoiseHg vengono forniti con estensioni convert, quindi "hg convert" non è nemmeno un comando valido su win32.
David Lay,

1
Ho provato a usare svn: // invece di file: // ma continua a chiedere collegamenti Python
fglez

L'utilizzo di svn: // invece di file: // ha funzionato per me senza i collegamenti Python. Per avviare il server svn il comando è: svnserve -r <path to repo root> -d
Petter Wigle

7

2
Lo so, è la prima cosa in cui mi sono imbattuto, ma citando: "Nota che non puoi farlo con i binari Mercurial Win32 - non c'è modo di installare i collegamenti Subversion nella sua libreria Python incorporata" Sto usando TortoiseHg ...
David Lay

Utilizzi un live CD Linux o una macchina virtuale?
richq

Questa è la risposta assolutamente corretta. L'ho fatto utilizzando solo l'estensione hg convert ( selenic.com/mercurial/wiki/… ) e utilizzando il protocollo file per il repository SVN senza estensione pysvn: hg convert file: /// X: / HOME / REPOS / mysvnrep newhgrep
van

5

Per convertire un repository SVN in un repository HG E copiarlo su un server diverso, avrai bisogno di alcune cose.

  1. TortoiseHG installato. (Controlla per vedere quale versione è attualmente in uso)
  2. Python installato. (Controlla per vedere quale versione è attualmente in uso)
  3. I moduli Python (li puoi trovare http://pysvn.tigris.org/project_downloads.html )
  4. Dovrai aggiungere l' convertestensione a Tortoise. Avvia TortoiseHG Workbench dal menu Start. Seleziona File -> Settings. Seleziona Extensionsdall'elenco. Seleziona la convertcasella di controllo e fai clic su OK.

Prima la conversione ...

  1. È meglio mappare la cartella in cui si trova l'attuale repository SVN sul computer su cui stai lavorando. (ad esempio, \\server\folder non mappare la cartella SVN Repo stessa. Mappare la cartella appena sopra di essa) Assegna una lettera all'unità mappata, comeY:\
  2. Apri un prompt dei comandi e digita: CD /D Y:\
  3. Al Y:\prompt digitare: hg convert y:/RepoName (utilizzare il nome del repository corrente) Fare attenzione alle barre avanti e indietro. Quello nel comando è una barra in avanti. Inoltre, se il nome contiene spazi, inserire il nome tra virgolette. (cioè Y:/"My Repo folder")
  4. Ora dovrebbe essere in esecuzione e creerà un'altra cartella accanto a quella vecchia. E una cartella hg dovrebbe essere all'interno. NON VERRÀ INIZIATO E NON INIZIARE!
  5. La conversione è completa.

Secondo la clonazione ...

  1. Aprire TortoiseHG Workbench. Vai aFile -> Clone Repository
  2. Origine: immettere il percorso completo del repository convertito.
  3. Destinazione: immettere il percorso completo di dove si desidera clonare il repository. Non è necessario creare una cartella nella nuova destinazione poiché il processo di clonazione la creerà e la inizializzerà.
  4. Aggiungi le autorizzazioni alla nuova cartella clonata.
  5. Hai finito!!!

Ciao, è possibile spiegare perché non dovresti initil primo repository?
Ben Page

3

Nessuno ancora menziona hgsubversion ( Extension Wiki ), che può farlo senza quasi alcun mal di testa (esclusi casi rari e albero specifico).

Basta aggiungere l'estensione, abilitarla e hg clone SVN_REPOal repository Mercurial locale


1

Questo è nelle FAQ di TortoiseHg :

Come posso convertire un repository subversion in Mercurial?

È necessario installare gli strumenti della riga di comando svn-win32-1.4.6, quindi aggiungerli al percorso. Quindi è necessario abilitare l'estensione di conversione. A questo punto, dovresti essere in grado di utilizzare il hg convertcomando " " per eseguire la conversione. Si prega di indirizzare problemi / domande sull'estensione di conversione alla mailing list Mercurial o #mercurialsu irc.freenode.net.

Quindi è apparentemente possibile - sto usando Linux quindi non ho provato da solo.


0

Ho appena convertito un repository SVN remoto con autenticazione HTTP in un repository Mercurial e lascia che te lo dica, non c'è molta documentazione su come farlo. Ho dovuto scaricare il sorgente Mercurial e installarlo da solo, usando il pacchetto sorgente, in questo modo i collegamenti SVN funzioneranno nel modo giusto.

L'ho installato come:

python setup.py install

Che ha funzionato perfettamente sulla mia scatola Server 2003. Ora posso convertire un repository SVN nel modo corretto, facendo qualcosa del genere:

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

La documentazione per ConvertExtension sul sito Mercurial non è molto chiara, ma dice questo:

Non c'è modo di installare i collegamenti Subversion nella libreria Python incorporata di [Mercurial]. Quindi dovrai usare un Mercurial installato sopra un Python autonomo

Quindi ora uso solo la versione stand-alone per la conversione e TortoiseHg per il lavoro VCS effettivo.


0

meglio tardi che mai ...

Due risposte al prezzo di una ...

  1. Se si tratta di un repository pubblico e open source, è possibile utilizzare http://svn2github.com/add/, che ha impiegato circa mezz'ora per clonare quel repository su GitHib e poi inserirlo in Hg.

  2. Il vantaggio dell'utilizzo hg convertè che può essere ripreso. La conversione di SVN in Hg può richiedere giorni . Se lo interrompi, riprenderà da dove era stato interrotto.

Di seguito è riportato un file batch che ho scritto perché Codeplex SVNbridge è spazzatura. Il repo in questo esempio ha impiegato un paio di giorni per recuperare l'intera cronologia (sono in Australia, quindi la latenza potrebbe essere stata un fattore). Mi piacerebbe pensare che abbia dato un bel colpo a un server TFS da qualche parte.

Questo file batch può essere eseguito in qualsiasi momento per estrarre gli aggiornamenti dalla sorgente SVN se sono gli unici rimasti sulla terra che utilizzano ancora SVN. Non l'ho testato, quindi guarda cosa succede se lo fai, quindi se fossi in te abbandonerei il ramo originale se intendi modificare il repository.

Il punto robocopy shamapè mantenere la cronologia SVN se cloni il repository Hg, shamap è effimero: controlla il file batch e shamap in (lo farei su un nuovo ramo).

il lotto ...

@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

Utilizzando l' convertestensione di Mercurial:

  1. Abilita l'estensione della conversione; aggiungi convert=alla [extensions]sezione di .hgrc in questo modo:

    [estensioni]
    convert =

  2. Linux necessita di collegamenti Python aggiuntivi: sudo apt-get install python-subversion
  3. Esegui il hg convertcomando
    • Vedi hg convert -hper aiuto
    • Esempio: hg convert http://[svnserver]/[Project] --source-type svn [DestinationDir] (vedi nota 2)
  4. Invia al repository Mercurial appena creato: hg push https://[mercurialserver]/[Project]

nota : puoi anche ripetere il comando hg convert per includere le nuove modifiche apportate nel repository svn dopo la conversione precedente.

nota 2 : Quando hg convert non funziona usando http://o svn://potresti prima fare il checkout del repository Subversion (o aggiornarne uno esistente) e convertire usando il checkout locale; esempio:hg convert [DirectoryOfLocalCheckout] --source-type svn [DestinationDir]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.