¿Cómo migrar de un repositorio de subversión complicado a un sistema de control de versiones distribuido?
Pregunta
Supongamos que tenemos un repositorio de subversión que se parece a
/original/0.1
/original/0.2
/variantA/trunk
/variantA/branches/who/branch_for_xxx
/variantA/branches/she/branch_for_yyy
/variantB/trunk
/variantB/branches/who/branch_for_zzz
(... 30 or 40 alike)
donde variantA y variantB son tenedores del software original.
Estoy buscando un método para migrar este repositorio a un sistema de control de versiones distribuido: un método
- no necesariamente pesa un solo comando
- para cualquiera de los sistemas de control de versiones distribuidos conocidos
- haciendo que los dvcs piensen en ellas ramas: /official/{0.1,0.2} árboles, / variantA / tronco de árbol, ...
- concienciar a los dvcs de la relación de herencia de esos árboles
Solución
Si considera Git como un posible candidato de DVCS, el script ruby svn2git hace lo que necesita.
Más detalles en la pregunta: < strong> Clonación de un repositorio Svn no estándar con Git-Svn
Otros consejos
Mercurial viene con una extensión de conversión que debe hacer lo que quieras. Consulte los convertir los detalles de la extensión en el sitio web de Mercurial.
Para Git, consulte las instrucciones en http://github.com/guides/import- from-subversion
La última vez que lo hice manualmente, usé los siguientes comandos. (Esto era para un proyecto que no usaba etiquetas o ramas. Usar svn2git podría producir mejores resultados que git-svn si tiene etiquetas o ramas.)
cat "mysvnusername = Me Myself <me.myself@somewhere.com>" >> authors.txt
svnserve --daemon --foreground --root <SVN-REPO-PARENT-DIR>
git svn clone --stdlayout --authors-file=authors.txt --no-metadata svn://localhost/<SVN-REPO-NAME>
# push to a public repo and clone from there, to get push/pull working easily
cd <SVN-REPO-NAME>
git remote add origin git@github.com:mygithubusername/<GIT-REPO-NAME>.git
git push origin master
cd ..
rm -rf <SVN-REPO-NAME>
git clone git@github.com:mygithubusername/<GIT-REPO-NAME>.git
Pero como tiene un diseño de repositorio SVN no estándar, deberá especificar los parámetros --trunk, --tags y --branches en lugar de --stdlayout para git svn clone .
Para representar todo el historial de herencia de su repositorio, puede intentar reordenar su repositorio para que, en lugar de una jerarquía no estándar, tenga un diseño de repositorio plano estándar:
/branches/original-0.1
/branches/original-0.2
/branches/variantA-trunk
/branches/variantA-who-branch_for_xxx
/branches/variantA-she-branch_for_yyy
/branches/variantB-trunk
/branches/variantB-who-branch_for_zzz
...
Eso debería facilitar que las herramientas de importación entiendan el repositorio. Luego, cuando se hayan importado, puede reorganizarlos mejor dentro del nuevo repositorio.
Además, he oído que Git 1.6.x admite la clonación profunda, por lo que puede proporcionar parámetros a git svn clone
como --branches = sucursales / * / *
que buscará ramas en la jerarquía. Consulte esta publicación para ver un ejemplo de usarlo.
$ bzr svn-import --layout trunk1 svn-root-url bzr.repo
Debería hacer lo correcto. Debe tener instalado el complemento bzr-svn para poder hacer esto.