Pregunta ¿Cómo migro un repositorio SVN con historial a un nuevo repositorio de Git?


Leí el manual de Git, preguntas frecuentes, curso intensivo de Git - SVN, etc. y todos explican esto y lo otro, pero en ninguna parte puede encontrar instrucciones simples como:

Repositorio SVN en: svn://myserver/path/to/svn/repos

Repositorio de Git en: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

No espero que sea tan simple, y no espero que sea un solo comando. Pero espero que no intente explicar nada, solo para decir qué pasos dar dado este ejemplo.


1392
2017-09-17 02:08


origen


Respuestas:


Magia:

$ git svn clone http://svn/repo/here/trunk

Git y SVN funcionan de manera muy diferente. Necesita aprender Git, y si desea rastrear cambios de SVN en sentido ascendente, necesita aprender git-svn. los git-svn La página man tiene una buena sección de ejemplos:

$ git svn --help

495
2017-09-17 18:20



Crea un archivo de usuario (es decir users.txt) para mapear usuarios SVN a Git:

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

Puede usar este trazador de líneas para construir una plantilla a partir de su repositorio SVN existente:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

SVN se detendrá si encuentra que un usuario SVN no está en el archivo. Pero después de eso, puede actualizar el archivo y la recuperación donde lo dejó.

Ahora extraiga los datos SVN del repositorio:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

Este comando creará un nuevo repositorio de Git en dest_dir-tmp y comienza a jalar el repositorio SVN. Tenga en cuenta que el indicador "--stdlayout" implica que tiene el diseño común de "trunk /, branches /, tags /" SVN. Si su diseño es diferente, familiarícese con --tags, --branches, --trunk opciones (en general git svn help)

Todos los protocolos comunes están permitidos: svn://, http://, https://. La URL debe apuntar al repositorio base, algo así como http://svn.mycompany.com/myrepo/repository. Eso debe no incluir /trunk, /tag o /branches.

Tenga en cuenta que, después de ejecutar este comando, a menudo parece que la operación está "colgando / congelada", y es bastante normal que se bloquee durante un tiempo prolongado después de inicializar el nuevo repositorio. Eventualmente, verá mensajes de registro que indican que está migrando.

También tenga en cuenta que si omite el --no-metadata flag, Git anexará información sobre la revisión SVN correspondiente al mensaje de confirmación (es decir git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Si no se encuentra un nombre de usuario, actualice su users.txt archivo entonces:

cd dest_dir-tmp
git svn fetch

Es posible que tenga que repetir ese último comando varias veces, si tiene un proyecto grande, hasta que se hayan obtenido todas las confirmaciones de Subversion:

git svn fetch

Cuando se complete, Git va a pagar el SVN trunk en una nueva rama. Cualquier otra rama se configura como controles remotos. Puede ver las otras ramas de SVN con:

git branch -r

Si desea mantener otras sucursales remotas en su repositorio, desea crear una sucursal local para cada una manualmente. (Skip trunk / master.) Si no lo haces, las ramas no se clonarán en el paso final.

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

Las etiquetas se importan como ramas. Debe crear una sucursal local, crear una etiqueta y eliminar la sucursal para tenerlas como etiquetas en Git. Para hacerlo con la etiqueta "v1":

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

Clona tu repositorio GIT-SVN en un repositorio limpio de Git:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

Las sucursales locales que creó anteriormente desde sucursales remotas solo se han copiado como sucursales remotas en el nuevo repositorio clonado. (Omitir troncal / maestro.) Para cada rama que desee conservar:

git checkout -b local_branch origin/remote_branch

Finalmente, elimine el control remoto de su repositorio limpio de Git que apunta al repositorio temporal ahora eliminado:

git remote rm origin

1466
2017-09-17 17:09



Migre de forma limpia su repositorio de Subversion a un repositorio de Git. En primer lugar, debe crear un archivo que asigne los nombres de los autores de las asignaciones de Subversion a los autores de Git, por ejemplo ~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

Luego puede descargar los datos de Subversion en un repositorio de Git:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Si estás en una Mac, puedes obtener git-svn de MacPorts mediante la instalación git-core +svn.

Si su repositorio de subversión está en la misma máquina que su repositorio de git deseado, entonces puede usar esta sintaxis para el paso de inicio, de lo contrario, todo lo mismo:

git svn init file:///home/user/repoName --no-metadata

183
2017-09-21 02:15



¡Utilicé el script svn2git y funciona como un encanto! https://github.com/nirvdrum/svn2git


67
2017-09-26 13:13



Sugiero que te sientas cómodo con Git antes de intentar usar git-svn constantemente, es decir, mantener SVN como el repositorio centralizado y usar Git localmente.

Sin embargo, para una migración simple con toda la historia, aquí están los pocos pasos simples:

Inicializar el repositorio local:

mkdir project
cd project
git svn init http://svn.url

Marque cuánto tiempo atrás desea comenzar a importar revisiones:

git svn fetch -r42

(o simplemente "git svn fetch" para todas las revoluciones)

En realidad, busca todo desde entonces:

git svn rebase

Puede verificar el resultado de la importación con Gitk. No estoy seguro de si esto funciona en Windows, funciona en OSX y Linux:

gitk

Cuando haya clonado su repositorio de SVN localmente, es posible que desee enviarlo a un repositorio de Git centralizado para facilitar la colaboración.

Primero crea tu repositorio remoto vacío (tal vez en GitHub?):

git remote add origin git@github.com:user/project-name.git

Luego, opcionalmente sincronice su rama principal para que la operación de extracción combine automáticamente el maestro remoto con su maestro local, cuando ambos contengan algo nuevo:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Después de eso, puede que estés interesado en probar mi propio git_remote_branch herramienta, que ayuda a tratar con sucursales remotas:

Primera publicación explicativa: "Git sucursales remotas"

Seguimiento de la versión más reciente: "Es hora de colaborar con git_remote_branch"


56



Hay una nueva solución para la migración sin problemas de Subversion a Git (o para usar ambos simultáneamente): SubGit (http://subgit.com/)

Estoy trabajando en este proyecto yo mismo. Usamos SubGit en nuestros repositorios, algunos de mis compañeros de equipo usan Git y algunos Subversion y hasta ahora funciona muy bien.

Para migrar de Subversion a Git con SubGit, necesita ejecutar:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Después de eso obtendrás el repositorio de Git en svn_repos / .git y puedes clonarlo, o simplemente continuar usando Subversion y este nuevo repositorio de Git juntos: SubGit se asegurará de que ambos estén siempre sincronizados.

En caso de que su repositorio Subversion contenga múltiples proyectos, se crearán múltiples repositorios Git en el directorio svn_repos / git. Para personalizar la traducción antes de ejecutarla, haga lo siguiente:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

Con SubGit puede migrar a Git puro (no git-svn) y comenzar a usarlo mientras mantiene Subversion todo el tiempo que lo necesite (para sus herramientas de compilación ya configuradas, por ejemplo).

¡Espero que esto ayude!


29



Ver el oficial git-svn página de manual. En particular, busque en "Ejemplos básicos":

Seguimiento y contribución a todo un proyecto administrado por Subversion (completo       con un tronco, etiquetas y ramas):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

16



Pro Git 8.2 lo explica: http://git-scm.com/book/es/Git-and-Other-Systems-Migrating-to-Git


14



SubGit (vs Pantalla azul de la muerte)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Es todo.

+ Para actualizar desde SVN, un repositorio de Git creado por el primer comando.

subgit import  directory/path/Local.git.Repo

Utilicé una forma de migrar a Git al instante para un enorme repositorio.
Por supuesto, necesitas algo de preparación.
Pero puede que no detenga el proceso de desarrollo, en absoluto.

Aquí está mi camino.

Mi solución se ve así:

  • Migrar SVN a un repositorio de Git
  • Actualice el repositorio de Git justo antes de que el equipo cambie a.

La migración lleva mucho tiempo para un gran repositorio SVN.
Pero la actualización de la migración completa solo en segundos.

Por supuesto que estoy usando SubGitmamá git-svn me hace Pantalla azul de muerte. Solo constantemente. Y git-svn me está aburriendo con Git "nombre de archivo demasiado largo" error fatal.

PASOS

1.  Descargar SubGit

2. Prepare migrar y actualizar comandos.

Digamos que lo hacemos para Windows (es trivial llevarlo a Linux).
En la instalación de un SubGit compartimiento directorio (subgit-2.X.X \ bin), crea dos archivos .bat.

Contenido de un archivo / comando para la migración:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

El comando "inicio" es opcional aquí (Windows). Permitirá ver los errores al inicio y dejó abierto un caparazón después de completar el SubGit.

Puedes agregar aquí parámetros adicionales similares a git-svn. Estoy usando solo --default-domain myCompanyDomain.com para arreglar el dominio de la dirección de correo electrónico de los autores de SVN.
Tengo la estructura de repositorio SVN estándar (trunk / branches / tags) y no tuvimos problemas con "mapping de autores". Así que ya no estoy haciendo nada.

(Si desea migrar etiquetas como sucursales o su SVN tiene varias carpetas de ramas / etiquetas, puede considerar usar el SubGit más detallado enfoque)

Consejo 1: Use --minimal-revision YourSvnRevNumber para ver rápidamente cómo se agota la cosa (algún tipo de depuración). Especialmente útil es ver nombres de autor o correos electrónicos resueltos.
O para limitar la profundidad del historial de migración.

Consejo 2: La migración puede ser interrumpida (Ctrl + do) y restaurado ejecutando el próximo comando / archivo de actualización.
No aconsejo hacer esto para grandes repositorios. He recibido "Excepción de Java + Windows sin memoria".

Consejo 3: Es mejor crear una copia de su repositorio de resultados simple.

Contenido de un archivo / comando para actualizar:

start    subgit import  directory/path/Local.git.Repo

Puede ejecutarlo cualquier cantidad de veces cuando desee obtener las confirmaciones del último equipo en su repositorio de Git.

¡Advertencia! No toques tu repositorio desnudo (creación de ramas, por ejemplo).
Tomarás el siguiente error fatal:

Error irrecuperable: no está sincronizado y no se puede sincronizar ... Traducir las revisiones de Subversion a Git confirma ...

3. Ejecute el primer comando / archivo. Tomará mucho tiempo para un gran repositorio. 30 horas para mi humilde repositorio.

Es todo.
Puede actualizar su repositorio Git desde SVN en cualquier momento cualquier cantidad de veces ejecutando el segundo archivo / comando. Y antes de cambiar tu equipo de desarrollo a Git.
Tomará solo unos segundos.



Hay una tarea más útil.

Empuje su repositorio Git local a un repositorio remoto de Git

¿Es tu caso? Procedamos

  1. Configure sus controles remotos

Correr:

$ git remote add origin url://your/repo.git
  1. Prepárese para el envío inicial de su enorme repositorio local de Git a un repositorio remoto

Por defecto, su Git no puede enviar grandes fragmentos. fatal: el extremo remoto colgó inesperadamente

Vamos a correr:

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 - 1 GB, etc.

Arregla tu local problemas de certificado. Si su git-server usa un certificado roto.

He inhabilitado certificados.

También su servidor Git puede tener un solicitar limitaciones de cantidad que deben corregirse.

  1. Empujar toda la migración al repositorio remoto de Git del equipo.

Ejecutar con un Git local:

git push origin --mirror

(git push origin '*: *' para versiones antiguas de Git)

Si obtiene lo siguiente: error: no se puede generar git: No existe dicho archivo o directorio... Para mí, la recreación completa de mi repositorio resuelve este error (30 horas). Puedes probar los próximos comandos

git push origin --all
git push origin --tags

O intenta reinstalar Git (inútil para mí) O puede crear ramas de todas las etiquetas y presionarlas. O, o, o ...


12



repositorio

Para casos complicados, restituir por Eric S. Raymond es la herramienta de elección Además de SVN, admite muchos otros sistemas de control de versiones a través de fast-export formato, y también CVS. El autor informa conversiones exitosas de repositorios antiguos como Emacs y FreeBSD.

La herramienta aparentemente apunta a una conversión casi perfecta (como convertir SVN's svn:ignore propiedades para .gitignore archivos) incluso para diseños de repositorio difíciles con una larga historia. En muchos casos, otras herramientas pueden ser más fáciles de usar.

Antes de profundizar en la documentación del reposurgeon línea de comando, asegúrese de leer el excelente Guía de migración de DVCS que repasa el proceso de conversión paso a paso.


8