Domanda

Quando si cambia il VCS per il mio progetto FakeItEasy da SVN per Mercurial su Google Code sono stato un po 'troppo ansioso (sono divertenti del genere). Quello che ho fatto è stato solo controllando l'ultima versione di SVN e poi commettere che checkout come la prima revisione del nuovo repo Mercurial. Questo ha ovviamente l'effetto che tutta la storia è perduto.

Più tardi, quando ottenere un po 'meglio acustomed a Mercurial mi sono reso conto che esiste una cosa come una "estensione convert" che permette di convertire un repo SVN in un repo Mercurial. Ora quello che voglio fare è quello di convertire il vecchio repo SVN e quindi avere tutti i set di cambiamento dal Mercurial attualmente esistente Repo importati in questo repo convertito eccezione il primo impegnano a Mercurial.

Ho convertito il repo SVN per un repo Mercurial locale, ma ora è quando mi sono bloccato. Ho pensato che sarei in grado di utilizzare l'estensione convert per portare la corrente repository Mercurial in quello convertito e avere una mappa giunzione rimuovere il primo commit, ma io non riesco a farlo funzionare.

Ho anche cercato di solo uso convertito senza mappa giunzione per ottenere tutti i set di cambiamento rispetto alla corrente repo Mercurial in quello convertito e il rebase la seconda versione della corrente fino all'ultimo commit dal vecchio repository SVN ma posso 't get che il lavoro sia.

Per rendere più chiaro questo Diciamo che ho questi due repository:

A: revA1-revA2
B: revB1-revB2-revB3 (Where revB1 is actually a copy of revA2)

Ora voglio combinare questi due nel nuovo repository che contiene questo:

C: revA1-revA2-revB2-revB3
È stato utile?

Soluzione

Finché stai cambiando gli hash sulle nuove revisioni (sei), si potrebbe anche semplicemente usare export e import (o il comando transplant che è un wrapper per i due).

È già nata la tua convertito, che è grande, ora andare in pronti contro termine B e fare:

hg export -o 'changeset-%R.patch' 1:tip

che creerà un insieme di modifiche -.. ## patch per ogni changeset in pronti contro termine B, ad eccezione del primo (numero zero)

Ora vai al repo C e importarli:

hg import $(ls *.patch | sort -V)

Questo dovrebbe tutto applica in modo pulito se effettivamente il revA2 e revB1 erano identici.

Altri suggerimenti

Si può tirare in cambiamenti da un repository non correlato con "--force hg pull"

Ecco un semplice esempio di utilizzo:

impostare le directory di test

C:\temp>mkdir hgtest
C:\temp>cd hgtest
C:\temp\hgtest>mkdir a
C:\temp\hgtest>mkdir b
C:\temp\hgtest>mkdir c

make repository a

C:\temp\hgtest>cd a
C:\temp\hgtest\a>hg init
C:\temp\hgtest\a>echo line one >> file.txt
C:\temp\hgtest\a>hg add file.txt
C:\temp\hgtest\a>hg ci -m "check in one"
C:\temp\hgtest\a>echo line two >> file.txt
C:\temp\hgtest\a>hg ci -m "check in two"
C:\temp\hgtest\a>echo line three >> file.txt
C:\temp\hgtest\a>hg ci -m "check in three"

fare repository b

C:\temp\hgtest\a>cd ..\b
C:\temp\hgtest\b>copy ..\a\file.txt file.txt
C:\temp\hgtest\b>hg init
C:\temp\hgtest\b>hg add file.txt
C:\temp\hgtest\b>hg ci -m "check in b one"
C:\temp\hgtest\b>echo line four >> file.txt
C:\temp\hgtest\b>hg ci -m "check in b two"
C:\temp\hgtest\b>echo line five >> file.txt
C:\temp\hgtest\b>hg ci -m "check in b three"

fare c repository come prima un clone di una, quindi tirare nei cambiamenti da b

C:\temp\hgtest\b>cd ..\c
C:\temp\hgtest\c>hg clone C:\temp\hgtest\a .
C:\temp\hgtest\c>hg pull --force C:\temp\hgtest\b
C:\temp\hgtest\c>hg merge
C:\temp\hgtest\c>hg ci -m "check in c one"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top