Converti il ​​progetto Mercurial in Git

Ho bisogno di convertire un progetto mercuriale in un progetto git, ma vorrei mantenere intatta la cronologia del commit. La mia soluzione attuale era semplicemente rimuovere i file relativi a hg e quindi git init e aggiungere manualmente i file che mi servivano, ma questo non avrebbe mantenuto la cronologia. Ci sono soluzioni a questo?

Puoi provare a utilizzare l’ esportazione rapida :

cd ~ git clone https://github.com/frej/fast-export.git git init git_repo cd git_repo ~/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo git checkout HEAD 

Dai anche un’occhiata a questa domanda SO .

Ok, finalmente l’ho risolto. Questo sta usando TortoiseHg su Windows. Se non lo stai usando puoi farlo dalla riga di comando.

  1. Installa TortoiseHg
  2. Fai clic con il pulsante destro del mouse su uno spazio vuoto in Esplora risorse e vai alle impostazioni di TortoiseHg:

Impostazioni TortoiseHg

  1. Abilita hggit :

inserisci la descrizione dell'immagine qui

  1. Apri una riga di comando, inserisci una directory vuota .

  2. git init --bare .git (Se non si utilizza un repository bare si avrà un errore come abort: git remote error: refs/heads/master failed to update

  3. cd nel tuo repository Mercurial.

  4. hg bookmarks hg

  5. hg push c:/path/to/your/git/repo

  6. Nella directory di Git: git config --bool core.bare false (Non chiedermi il perché: qualcosa su “alberi di lavoro” .Git è seriamente ostile, giuro che scrivere il codice reale è più facile che usare Git.)

Spero che funzionerà e quindi potrai passare da quel nuovo repo git a uno non nudo.

Se desideri importare il tuo repository mercuriale esistente in un repository “GitHub”, ora puoi semplicemente utilizzare GitHub Importer disponibile qui [Accesso richiesto]. Non dovrai più scherzare con l’ esportazione veloce ecc. (Sebbene sia uno strumento molto valido)

Otterrai intatti tutti i tuoi commit , rami e tag . Un’altra cosa interessante è che puoi cambiare anche l’ id-email dell’autore . Controlla sotto gli screenshot:

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

Alcune note della mia esperienza di conversione di Mercurial in Git.

1. hg-fast-export

Utilizzo di hg-fast-export fallito e ho bisogno di –force come notato sopra. Successivamente ho ricevuto questo errore:

errore: imansible bloccare ref ‘refs / heads / stable’: ‘refs / heads / stable / sub-branch-name’ esiste; imansible creare ‘refs / heads / stable’

Al completamento della hg-fast-export ho finito con un repo amputato. Penso che questo repository abbia un buon numero di filiali orfane e che hg-fast-export abbia bisogno di un repo in qualche modo idealizzato. Tutto ciò sembrava un po ‘approssimativo, quindi sono passato a Kiln Harmony ( http://blog.fogcreek.com/announcing-kiln-harmony-the-future-of-dvcs/ )

2. Forno

Kiln Harmony non sembra esistere su un account di livello gratuito come suggerito sopra. Potrei scegliere tra repository solo Git e solo Mercurial e non ci sono opzioni per cambiare. Ho sollevato un ticket di supporto e condividerò il risultato se rispondono.

3. hg-git

Il plugin mercurial Hg-Git ( http://hg-git.github.io/ ) ha funzionato per me. FYI su Mac OSX Ho installato hg-git tramite macports come segue:

  • sudo port installa python27
  • porta sudo select –set python python27
  • sudo port install py27-hggit
  • vi ~ / .hgrc

.hgrc ha bisogno di queste righe:

 [ui] username = Name Surname  [extensions] hgext.bookmarks = hggit = 

Ho quindi avuto successo con:

 hg push git+ssh://[email protected]:myaccount/myrepo.git 

4. Avvertenza: conosci il tuo repository

Tutto quanto sopra sono strumenti contundenti e ho solo spinto in avanti perché ci è voluto abbastanza tempo per convincere la squadra a usare correttamente git.

Dopo aver spinto per la prima volta il progetto per (3), ho finito con il perdere tutte le nuove modifiche. Questo perché questa linea di codice deve essere vista solo come guida:

 $ hg bookmark -r default master # make a bookmark of master for default, so a ref gets created 

La teoria è che il ramo predefinito può essere considerato padrone quando si preme a git, e nel mio caso ho ereditato un repository dove hanno usato “stable” come l’equivalente di master. Inoltre, ho anche scoperto che la punta del repository era una correzione non ancora unita al ramo “stabile”.

Senza una corretta comprensione sia di Mercurial che del repository da convertire, è probabilmente meglio non eseguire la conversione.

Ho fatto quanto segue al fine di ottenere il pronti contro termine pronti per un secondo tentativo di conversione:

 hg update -C stable hg merge stable/hotfix-feature hg ci -m "Merge with stable branch" hg push git+ssh://[email protected]:myaccount/myrepo.git 

Dopo questo ho avuto un progetto verificabile in git, tuttavia tutti i rami orfani che ho menzionato prima sono spariti. Non penso che sia troppo serio, ma potrei vivere per rimpiangere questo come una svista. Quindi il mio ultimo pensiero è di mantenere comunque l’originale.

Modifica: se vuoi solo l’ultimo commit in git, questo è più semplice di quanto riportato sopra:

 hg book -r tip master hg push git+ssh://[email protected]:myaccount/myrepo.git 

Un’altra opzione è quella di creare un account Kiln gratuito – round trip tra git e hg con il 100% di conservazione dei metadati, quindi puoi usarlo per una conversione una tantum o usarlo per accedere a un repository usando il client che preferisci.

A partire dal:

http://hivelogic.com/articles/converting-from-mercurial-to-git

Migrazione

È un processo relativamente semplice. Per prima cosa eseguiamo il download rapido (il modo migliore è tramite il repository Git, che clonerò direttamente sul desktop), quindi creiamo un nuovo repository git, eseguiamo la migrazione e controlliamo l’HEAD. Sulla riga di comando, va così:

 cd ~/Desktop git clone git://repo.or.cz/fast-export.git git init git_repo cd git_repo ~/Desktop/fast-export/hg-fast-export.sh -r /path/to/old/mercurial_repo git checkout HEAD 

Dovresti vedere un lungo elenco di commit mentre il tuo progetto viene migrato dopo aver eseguito l’esportazione rapida. Se vedi errori, sono probabilmente correlati a un percorso Python specificato in modo improprio (vedi la nota sopra e personalizza il tuo sistema).

Ecco, hai finito.

Avevo un compito simile da fare, ma conteneva alcuni aspetti che non erano sufficientemente trattati dalle altre risposte qui:

  • Volevo convertire tutti i rami (nel mio caso: due, o in generale: più di uno) del mio repository.
  • Avevo caratteri non ASCII e (essendo un utente Windows) non codificati in UTF8 (per curiosi: umlaute tedesco) nei miei messaggi di commit e nomi di file.

Non ho provato fast-export e hg-fast-export, dal momento che richiedono di avere Python e alcuni moduli Mercurial Python sulla tua macchina, cosa che non avevo.

Ho provato hg-init con TortoiseHG, e questa risposta mi ha dato un buon inizio. Ma sembra che converte solo il ramo attuale, non tutto in una volta (*). Così ho letto i documenti di hg-init e questo post sul blog e ho aggiunto

 [git] branch_bookmark_suffix=_bookmark 

al mio mercurial.ini, e lo fece

 hg bookmarks -r default master hg bookmarks -r my_branch my_branch_bookmark hg gexport 

(Ripeti la seconda linea per ogni ramo che vuoi convertire, e ripeti di nuovo se dovessi fare un altro commit prima di eseguire la terza linea). Questo crea una cartella git all’interno di .hg , che si rivela essere un semplice repository Git con tutti i rami esportati. Potrei clonare questo repo e ho avuto una copia funzionante come desiderato.

O quasi …

In esecuzione

 git status 

sulla mia copia di lavoro mostrava tutti i file con caratteri non ASCII nei loro nomi come file non tracciati. Così ho continuato la ricerca e ho seguito questo consiglio :

 git rm -rf --cached \* git add --all git commit 

E finalmente il repository era pronto per essere spinto fino a Bitbucket 🙂

Ho anche provato l’importatore Github come menzionato in questa risposta . Ho usato Bitbucket come sistema sorgente e Github ha fatto un buon lavoro, cioè ha convertito automaticamente tutti i rami. Tuttavia, mostrava “?” – caratteri per tutti i caratteri non ASCII nei miei messaggi di commit (Web-UI e localmente) e nomi di file (solo Web-UI), e mentre potevo correggere i nomi dei file come descritto sopra, non avevo idea cosa fare con i messaggi di commit, quindi preferirei l’approccio hg-init. Senza il problema di codifica, l’importatore di Github sarebbe stata una soluzione perfetta e veloce (a patto che tu abbia un account Github a pagamento o possa tollerare che il tuo repository sia pubblico per tutto il tempo necessario per caricarlo da Github al computer locale).


(*) Quindi è sembrato che prima di scoprire di dover inserire tra i segnalibri tutti i rami che voglio esportare. Se lo fai e vai a un repository (!), Come dice la risposta collegata, ottieni tutti i rami.

Questo sarebbe meglio come commento, mi spiace di non avere permessi di commento.

@ commento mar10 è stato il pezzo mancante che avevo bisogno di fare questo.

Nota che ‘/ path / to / old / mercurial_repo’ deve essere un percorso sul file system (non un URL), quindi devi prima clonare il repository originale. – 27 marzo 2013 alle 16:30

Questo commento riguarda la risposta che ho risolto per me, https://stackoverflow.com/a/10710294/2148757 che è la stessa risposta di quella contrassegnata corretta qui, https://stackoverflow.com/a/16037861 / 2148757

Questo ha spostato il nostro progetto hg per git con la cronologia dei commit intatta.