tortoise - migrate svn to git with branches
¿Cómo puedo volver a conectar un repositorio git con un repositorio svn? (5)
Desde el gráfico de confirmación.
F
|/
| /
E D
| |
C1 C2
| |
B1 B2
| |
A1 A2
usa el siguiente comando
git checkout <SHA1-B1>
git checkout -b new
git cherry-pick <SHA1-C2> <SHA1-D>
git checkout <SHA1-F>
git checkout -b position_f
git merge new
Hecho. De todos modos, no lo he probado todavía. Copia de seguridad de su repositorio al principio.
git svn
para importar un repositorio de Subversion existente en git. Luego empujé esto para git repo en un servidor git. En los últimos meses, se han realizado cambios en el software tanto en Subversion como en los repositorios git. Desafortunadamente, mi copia local con los enlaces entre svn y git ha sido eliminada.
He intentado volver a crear la copia local usando git svn
nuevo, pero cuando hago una extracción desde el servidor de git, se muestra una warning: no common conflicts
y termino fusionando dos sucursales separadas con las mismas confirmaciones al comienzo. Me gusta esto:
F
|/
| /
E D
| |
C C
| |
B B
| |
A A
¿Cómo puedo obtenerlo para tratar los cambios svn como ocurrieron en una rama del repositorio original?
F
|/
| /
E D
| /
|/
C
|
B
|
A
La solución más sencilla es llevar las sucursales locales de git-svn a su servidor de git, de esta manera:
git push <git-server> <branch-name>:<branch-name>
Anulará las sucursales de git-server con las locales.
Hágalo solo si está seguro de que las sucursales de git-svn tienen todas las confirmaciones que tiene el servidor de git.
Por defecto, git-svn
almacena la asignación entre las revisiones de SVN y los confirmaciones de Git en los mensajes de confirmación. ¿Ve estas líneas de git-svn-id
para confirmaciones más antiguas en su repositorio original de Git? Aquí quiero decir que el repositorio de Git alojado en el servidor de Git y no el que has obtenido de SVN recientemente.
Si es así, realmente no perdiste ningún enlace y git-svn debería poder restaurar los datos necesarios del historial. Aunque debido a algunos problemas de compatibilidad entre diferentes versiones de git-svn, esto puede ser un poco complicado:
Clona tu repositorio original de Git:
$ git clone $GIT_SERVER repo $ cd repo
Actualice la configuración de git-svn en .git / config:
$ git config svn-remote.svn.url $SVN_URL $ git config svn-remote.svn.fetch trunk:refs/remotes/trunk $ git config svn-remote.svn.branches branches/*:refs/remotes/* $ git config svn-remote.svn.tags tags/*:refs/remotes/tags/*
Ahora tiene que actualizar refs / remotes / * refs a las últimas confirmaciones con la línea git-svn-id:
$ git log --first-parent refs/heads/master commit d566edf5f77ae0a2f7418c40949757e75ef8e83c D commit 4df9f21346526c6505a954d8310637864710308d C git-svn-id: $SVN_URL .../trunk@3... commit 116a6760d3e278aa4d54f5bb22e531d30d731661 B git-svn-id: $SVN_URL .../trunk@2... commit d8bb201c6fd55ea5e645f2d8a07248593d177910 A git-svn-id: $SVN_URL .../trunk@1...
Como puede ver, la confirmación D no tiene una línea git-svn-id, pero la confirmación C tiene una y esa línea se refiere a la troncal, por lo que debe actualizar refs / remotes / trunk para confirmar C:
$ git update-ref refs/remotes/trunk 4df9f21346526c6505a954d8310637864710308d
Si tiene muchas ramas y etiquetas, repita los mismos pasos con respecto a la asignación que hemos especificado anteriormente:
ramas / foo => refs / remotes / foo
tags / 1.0 => refs / remotes / tags / 1.0
El último paso es restaurar la asignación en el directorio .git / svn:
$ git svn fetch Migrating from a git-svn v1 layout... Data from a previous version of git-svn exists, but .git/svn (required for this version (X.Y.Z) of git-svn) does not exist. Done migrating from a git-svn v1 layout Rebuilding .git/svn/refs/remotes/trunk/.rev_map.694389ff-b137-4359-84f9-4d1a25628e89... r1 = d8bb201c6fd55ea5e645f2d8a07248593d177910 r2 = 116a6760d3e278aa4d54f5bb22e531d30d731661 r3 = 4df9f21346526c6505a954d8310637864710308d Done rebuilding .git/svn/refs/remotes/trunk/.rev_map.694389ff-b137-4359-84f9-4d1a25628e89
El último comando también obtiene nuevas revisiones del servidor SVN. Después de que se complete el comando, tiene un clon git-svn del repositorio de Subversion. El historial en este repositorio se ha desviado, por lo que debe sincronizar los cambios entre los repositorios SVN y Git como de costumbre:
$ git svn rebase
$ git svn dcommit
Espero que ayude.
Primero, verificaba la salida del comando git svn info
. ¿Ves algunas cosas extrañas allí?
En segundo lugar, lo importante es que no es una buena idea usar git svn
con un repositorio de git secundario que no sea el local.
La razón es que después de cada git svn dcommit
git reescribe automáticamente todos los compromisos que realizó anteriormente: primero los devuelve a svn y luego agrega el número de revisión svn para el compromiso (en un identificador único llamado git-svn-id
).
Debería ser algo como esto en un repositorio donde hiciste un nuevo dcommit
:
$ git log -1
commit 1234abc...
Author: ...
Date: ...
Some commit message
git-svn-id: http://your.svn.repo/svn/trunk@10 1234abc
Acerca de los detalles, aquí hay una sección del libro de ProGit .
El mensaje de error que escribió es probablemente una warning: no common commits
(no hay conflicts
como escribió en la pregunta), y mi impresión es que git no introdujo estos metadatos en el repositorio remoto.
Creo que puedes levantar este enlace SVN de la muerte, pero ten cuidado, hazlo en un clon separado del repositorio y lee la documentación cuidadosamente sobre los metadatos que necesita. En Git, puedes hacer muchas cosas con las herramientas de plomería, échales un vistazo.
Por cierto, ¿no puedes simplemente clonar el repositorio remoto de git y usar eso?
Espero que esto ayude en algo, o al menos te dé algunas ideas donde puedes comenzar a buscar una solución.
Qué tal esto:
- Tome una copia de seguridad!
- Reimporta la historia svn en git
- Consigue tu antigua rama y la nueva rama en el mismo repositorio.
- Rebobina tu sucursal al cometer antes de
F
- Cambie de base todos los cambios en su rama desde su
C
en la parte superior de laC
recién importada por svn - Vuelva a intentar la fusión
Si esto no funciona, puedes intentar reemplazar Git , pero podría ser una mala idea.