2009-06-10 10 views
65

Uno de mis compañeros de equipo ha preguntado si es posible exportar de un SVN a otro, todo mientras se mantiene el historial.Copia SVN entre repositorios con historial

Para mí, esto parece que sería una solicitud común.

So: ¿Es posible migrar entre repositorios SVN mientras se mantiene el historial?

Es importante tener en cuenta que no tenemos acceso svnadmin en el origen, pero sí lo tenemos en el destino.

Si esto se reduce a simplemente verificar cada revisión de la fuente y registrarla en el destino, estaríamos de acuerdo con eso, siempre que haya un proceso automatizado para eso.

EDIT: Olvidé mencionar que el repositorio de destino está en Windows.

+0

que se puede pedir a cualquiera que tiene que hacer svnadmin derechos de exportación para usted. – Glen

Respuesta

39

[Editar : La respuesta original de abajo es de pre SVN 1.7, y ésta era la mejor manera de resolver el problema (aunque no es el caso de uso principal de svnsync). En SVN 1,7 cliente o temprano es la herramienta svnrdump que hace más directamente lo que está tratando de lograr)]


uso svnsync para sincronizar el origen al destino (necesita acceso de administrador al repositorio de destino o al menos una forma de agregar ganchos, pero sin acceso especial al depósito de origen). Si el destino ya tiene revisiones, sincronice el origen con un repositorio temporal y luego use svn-merge-repos.pl para fusionar los dos repositorios locales.

+0

Esto se ve muy cerca de mis requisitos. –

+0

¿No es posible hacer un simple 'svnsync TOURL FROMURL'? –

+0

Las opciones de la línea de comando son diferentes, vea http://linux.die.net/man/1/svnsync. Y debe crear primero un gancho pre-revprop-change (o quizás pre-revprop-change.bat si está en Windows). – mihi

8

La forma de lograrlo es el svnadmin dump command. Si no tiene acceso a svnadmin, le preguntaría a la persona que lo hace si pueden proporcionarle un vertedero. Esto hará que el proceso de importación sea mucho más fácil también.

¿Estás actualmente en un repositorio compartido? Esto podría hacer que la persona que posee el repositorio se preocupe de darte un tugurio, ya que será una copia de todo el repositorio, no solo de tu parte.

+0

Sí, esta sería una fuente de repositorio compartido. Y es por eso que no podemos obtener un basurero. –

+0

¿Quizás podría convencer al propietario de que le proporcione un volcado filtrado, utilizando svndumpfilter? Consulte http://svnbook.red-bean.com/en/1.5/svn.reposadmin.maint.html#svn.reposadmin.maint.tk.svndumpfilter para obtener más información. – markusk

+0

parece que svnsync es casi la mejor manera de hacerlo. –

8

Tuve una necesidad similar (por lo tanto, visité esta página) y terminé escribiendo mi propio programa para hacer el trabajo. Aunque la herramienta puede ser útil para otros que todavía están buscando una solución:

  • La herramienta no necesita acceso de administrador al repositorio de origen.
  • Admite agregar/eliminar/copiar/mover, preserva la propiedad del nodo (por ejemplo, svn: ignorar, svn: externo) y la propiedad de revisión (es decir, obtiene el autor correcto y la fecha/hora).
  • También se pueden copiar incrementalmente nuevas revisiones.
  • Tiene una GUI y una utilidad de línea de comandos.

Si alguien está interesado, mira eso here

+0

¡Parece muy interesante! –

0

Si sólo necesita un acuerdo de recompra de control de versiones con plena conjunto de cambios, puede usar bzr con el plugin bzr-svn. Cuando pague un svn repo, todo se sincronizará.

8

Puede usar git-svn (o tal vez otro sistema SCM) para realizar esta tarea.

Los pasos serían:

1. Get a git svn clone of each repository: 
    git svn clone <SVN-REPOSITORY-FROM> source-repo 
    git svn clone <SVN-REPOSITORY-TO> dest-repo 

2. Create patches to be imported: 
    cd source-repo/ 
    export commitFrom=`git log --pretty=%H | tail -1` 
    git format-patch -o /tmp/mergepatchs ${commitFrom}..HEAD . 

3. Import the patches 
    cd dest-repo/ 
    git am /tmp/mergepatchs/*.patch 

referenciado: http://blog.neutrino.es/2012/git-copy-a-file-or-directory-from-another-repository-preserving-history/

+2

funcionó imperfectamente para mí. Ahora soy el autor de todos los cambios, y todo está fechado hoy. Tenga en cuenta que el "dest-repo" del ejemplo anterior ahora es un repositorio GIT, y SVN-REPOSITORY-TO todavía está en SVN. – MarkHu

+0

Funciona muy bien, pero como mencioné terminaste con un repositorio git local, así que tuve que ejecutar "git svn dcommit" en el dest-repo para enviarlo todo al repositorio SVN de destino. –

Cuestiones relacionadas