29 votes

Fractionner les grands repo en plusieurs subrepos et de préserver l'histoire (Mercurial)

Nous avons une grande base de code qui contient plusieurs projets communs, la solution fichiers, etc en un répertoire SVN. Nous sommes à la migration vers l'Mercurial. Je voudrais profiter de cette occasion pour réorganiser notre code en plusieurs référentiels pour faire le clonage pour la ramification ont moins de frais généraux. J'ai déjà réussi à convertir notre repo de SVN, Mercurial, tout en préservant l'histoire. Ma question: comment puis-je briser tous les différents projets en différents référentiels, tout en préservant leur histoire?

Voici un exemple de ce que notre référentiel unique (OurPlatform) ressemble actuellement:

/OurPlatform
---- Core
---- Core.Tests
---- Database
---- Database.Tests
---- CMS
---- CMS.Tests
---- Product1.Domain
---- Product1.Stresstester
---- Product1.Web
---- Product1.Web.Tests
---- Product2.Domain
---- Product2.Stresstester
---- Product2.Web
---- Product2.Web.Tests
==== Product1.sln
==== Product2.sln

Tous ceux-là sont les dossiers contenant VS les Projets sauf pour les fichiers de la solution. Produit1.la sln et Produit2.la sln à la fois référence à tous les autres projets. Idéalement, j'aimerais profiter de chacun de ces dossiers, et de les transformer en séparer Hg repos, et aussi d'ajouter de nouvelles repos pour chaque projet (ils agiraient en tant que parent repos). Alors, Si quelqu'un allait travailler sur Produit1, ils clone du Produit1 repo, qui contenait Produit1.la sln et subrepo références à ReferenceAssemblies, Core, Core.Tests, Base De Données, Base De Données.Tests, CMS et CMS.Les Tests.

Ainsi, il est facile de le faire en seulement hg init qui pratiquent dans les répertoires du projet. Mais peut-il être réalisé tout en préservant l'histoire? Ou est-il un meilleur moyen d'arranger cela?

EDIT::::

Grâce à Ry4an réponse, j'ai pu accomplir mon objectif. Je voulais partager ce que j'ai fait ici pour les autres.

Depuis nous avons eu beaucoup de projets séparés, j'ai écrit un petit script bash pour automatiser la création de la filemaps et de créer la finale bat script pour faire la conversion. Ce n'était pas évident à partir de la réponse, c'est que la commande de conversion doit être exécuté une fois pour chaque filemap, pour produire un référentiel distinct pour chaque projet. Ce script devra être placé dans le répertoire ci-dessus, un svn copie de travail que vous avez déjà converti. J'ai utilisé la copie de travail puisque c'est la structure de fichier plus adapté à ce que je voulais la version définitive de la nouvelle hg repos à l'être.

#!/bin/bash

# this requires you to be in: /path/to/svn/working/copy/, and issue: ../filemaplister.sh ./

for filename in *
do
  extension=${filename##*.} #$filename|awk -F . '{print $NF}'
  if [ "$extension" == "sln" -o "$extension" == "suo" -o "$extension" == "vsmdi" ]; then
    base=${filename%.*}
    echo "#$base.filemap" >> "$base.filemap"
    echo "include $filename" >> "$base.filemap"
    echo "C:\Applications\TortoiseHgPortable\hg.exe convert --filemap $base.filemap ../hg-datesort-converted ../hg-separated/$base > $base.convert.output.txt" >> "MASTERGO.convert.bat"
  else
    echo "#$filename.filemap" >> "$filename.filemap"
    echo "include $filename" >> "$filename.filemap"
    echo "rename $filename ." >> "$filename.filemap"
    echo "C:\Applications\TortoiseHgPortable\hg.exe convert --filemap $filename.filemap ../hg-datesort-converted ../hg-separated/$filename > $filename.convert.output.txt" >> "MASTERGO.convert.bat"  
  fi  
done;

mv *.filemap ../hg-conversion-filemaps/
mv *.convert.bat ../hg-conversion-filemaps/

Ce script vérifie tous les fichiers dans un svn copie de travail, et selon le type crée un nouveau filemap fichier ou ajoute à un existant. Le si est vraiment juste pour attraper divers visual studio fichiers, et de les placer dans un autre repo. Ceci est destiné à être exécuté sur le coup (cygwin dans mon cas), mais l'exécution de l'effectif commande de conversion est accompli grâce à la version de hg livré avec TortoiseHg en raison de la fourche/questions de processus sur Windows (gah, je sais...).

Si vous exécutez le MASTERGO.convertir des.le fichier bat, qui ressemble à votre converti hg repo, et crée distincte de repos à l'aide de l'fournis filemap. Après il est complet, il y a un dossier appelé hg-séparé qui contient un dossier/repo pour chaque projet, ainsi qu'un dossier/repo pour chaque solution. Ensuite, vous devez manuellement clone tous les projets dans une solution de pensions de titres, et ajouter les clones à l' .hgsub fichier. Après avoir commis un .hgsubstate fichier est créé et vous êtes prêt à aller!

Avec l'exemple donné ci-dessus, mon .hgsub fichier ressemble à ceci "Produit1":

Product1.Domain = /absolute/path/to/Product1.Domain
Product1.Stresstester = /absolute/path/to/Product1.Stresstester
Product1.Web = /absolute/path/to/Product1.Web
Product1.Web.Tests = /absolute/path/to/Product1.Web.Tests

Une fois que j'ai le transfert de ces repos à un serveur central, je vais être de modifier manuellement les chemins d'url.

Aussi, il n'y a rien d'analogue à la première OurPlatform repo svn, puisque tout est séparé maintenant.

Merci encore!

28voto

Ry4an Points 56453

Cela peut absolument être fait. Vous aurez envie d'utiliser le hg convert commande. Voici le processus que j'avais utiliser:

  1. tout convertir un seul hg référentiel à l'aide de hg convert avec un type de source de svn et un dest type de hg (il semble que vous avez déjà fait cette étape)
  2. créer une collection d' filemap fichiers pour une utilisation avec des hg converts' --filemap option
  3. exécutez hg convert avec le type de source de hg et dest type hg et la source de l'mercurial repo créé à l'étape un, et le faire pour chacun des filemaps vous avez créé à l'étape deux.

Le filemap syntaxe est indiqué dans l' hg help convert de la production, mais voici l'essentiel:

The filemap is a file that allows filtering and remapping of files and
directories. Comment lines start with '#'. Each line can contain one of
the following directives:

  include path/to/file

  exclude path/to/file

  rename from/file to/file

Donc dans votre exemple, votre filemaps devrait ressembler à ceci:

# this is Core.filemap
include Core
rename Core .

Notez que si vous avez un comprennent que l'exclusion de tout ce qui est implicite. Aussi que renommer la ligne se termine par un point et se déplace tout monter d'un niveau.

# this is Core.Tests
include Core.Tests
rename Core.Tests .

et ainsi de suite.

Une fois que vous avez créé l'brisée référentiels pour chaque de la nouvelle repos, vous pouvez supprimer l'a-tout initial repo créé à l'étape un et de commencer la configuration de votre subrepo configuration en .hgsub fichiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X