2010-04-21 2 views
8

Lors du changement de VCS pour mon projet FakeItEasy de SVN à Mercurial sur Google Code j'étais un peu trop impatient (je suis drôle comme ça). Ce que j'ai fait, c'était simplement vérifier la dernière version de SVN et ensuite valider cette vérification comme la première révision du nouveau repo Mercurial. Cela a évidemment pour effet que toute l'histoire est perdue. Plus tard, au fur et à mesure que je m'habituais à Mercurial, je me suis rendu compte qu'il existe une «extension de conversion» qui permet de convertir un dépôt SVN en un repo Mercurial. Maintenant, ce que je veux faire est de convertir l'ancien repo SVN et ensuite avoir tous les ensembles de changements du repo Mercurial actuellement importé dans ce repo converti sauf le tout premier commit à Mercurial.Ajout de modifications d'un référentiel Mercurial à un autre

J'ai converti le repo SVN en un repo Mercurial local mais maintenant c'est quand je suis bloqué. Je pensais que je serais capable d'utiliser l'extension convert pour amener le dépôt Mercurial actuel dans le dépôt converti et avoir une carte d'épissure supprimer le premier commit mais je n'arrive pas à faire fonctionner ça. J'ai aussi essayé d'utiliser convert sans mappage d'épissures pour convertir tous les changements du repaire Mercurial actuel en le repo converti et rebaser la deuxième version du dernier dépôt SVN, mais Je n'arrive pas à le faire fonctionner non plus.

Pour rendre cela plus clair permet de dire que j'ai ces deux référentiels:

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

Maintenant, je veux combiner ces deux dans le nouveau référentiel contenant ceci:

C: revA1-revA2-revB2-revB3 

Répondre

11

Tant que vous êtes changer les hachages sur les nouvelles révisions (vous êtes), vous pouvez aussi bien utiliser export et import (ou la commande transplant qui est une enveloppe autour des deux).

Vous avez déjà fait votre converti, ce qui est génial, allez maintenant en B repo et faites:.

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

qui va créer un changeset - ## patch pour chaque changeset en B repo, à l'exception du premier (numéroté zéro).

Allez maintenant à C repo et de les importer:

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

Tout cela devrait appliquer proprement si en effet le revA2 et revB1 étaient identiques.

+0

Cela fonctionne parfaitement sauf pour une chose. Je n'arrive pas à faire fonctionner l'import avec le caractère générique, donc j'ai dû faire une importation pour chaque fichier de correctif, mais je n'ai dû le faire qu'une fois de toute façon. Merci! –

+1

Ouais, le joker ne fonctionnerait que sur unix où votre shell fait l'extension glob. Sur Windows, chaque application a besoin de cette logique, donc si vous êtes sur Windows, vous avez besoin d'une boucle FOR ou exécutez chacun comme vous l'avez fait. Content que ça a marché. –

+0

Cela peut ne pas fonctionner aussi bien sur Linux pour une raison simple: les changesets sont numérotés en utilisant un nombre variable de chiffres (ie 1,2,3, ..., 10,11, ... 100,101, etc.), provoquant ' changeset-10.patch' à importer avant 'changeset-2.patch' en fonction de l'expansion normale du shell. Vous devriez les trier: 'hg import $ (ls * .patch | sort -V)' –

0

Vous pouvez tirer des changements à partir d'un référentiel sans rapport avec "hg pull --force"

Voici un exemple simple d'utilisation:

mis en place les répertoires de 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 dépôt 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" 

faire dépôt 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" 

make dépôt c en tant que premier clone d'un, puis tirer dans les changements de 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" 
+0

Oui, le problème avec ceci est que je reçois le premier commit dans le référentiel B inclus dont je ne veux pas . Sauf si je néglige quelque chose. –

+0

Vous aurez toutes les révisions des deux référentiels (y compris le duplicata), mais il devrait fusionner sans conflit. Il vous laisse avec un historique de révisions légèrement plus compliqué que la solution d'export/import. –

Questions connexes