it-swarm-es.tech

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

Leí el manual de Git, las preguntas frecuentes, el curso intensivo de Git - SVN, etc., y todos explican esto y aquello, pero en ninguna parte puedes encontrar una instrucción simple como:

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

Git repositorio 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 que diga qué pasos tomar dado este ejemplo.

1453
Milan Babuškov

Mágico:

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

Git y SVN operan de manera muy diferente. Necesita aprender Git, y si desea realizar un seguimiento de los cambios de SVN en sentido ascendente, debe aprender git-svn. La página del manual git-svn tiene una buena sección de ejemplos:

$ git svn --help
513
jfm3

Cree un archivo de usuarios (es decir, users.txt) para asignar usuarios SVN a Git:

user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...

Puede usar este one-liner para construir una plantilla desde 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 un usuario faltante de SVN que no está en el archivo. Pero después de eso, puede actualizar el archivo y recogerlo 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 Git en dest_dir-tmp y comenzará a extraer el repositorio SVN. Tenga en cuenta que el indicador "--stdlayout" implica que tiene el "troncal /, ramas /, etiquetas /" diseño SVN común. Si su diseño difiere, familiarícese con las opciones --tags, --branches, --trunk (en general git svn help).

Se permiten todos los protocolos comunes: svn://, http://, https://. La URL debe apuntar al repositorio base, algo 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á "bloqueada/congelada", y es bastante normal que se pueda atascar durante mucho tiempo después de inicializar el nuevo repositorio. Finalmente, verá mensajes de registro que indican que se está migrando.

También tenga en cuenta que si omite el indicador --no-metadata, Git agregará 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 archivo users.txt 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 recuperado todas las confirmaciones de Subversion:

git svn fetch

Cuando se complete, Git ingresará el SVN trunk en una nueva sucursal. Cualquier otra rama se configura como mandos a distancia. Puedes ver las otras ramas SVN con:

git branch -r

Si desea mantener otras sucursales remotas en su repositorio, desea crear una sucursal local para cada una manualmente. (Omita el tronco/maestro). Si no hace esto, 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. Tienes que crear una rama local, crear una etiqueta y eliminar la rama 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

Clone su repositorio GIT-SVN en un repositorio Git limpio:

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

Las sucursales locales que creó anteriormente desde las sucursales remotas solo se copiarán como sucursales remotas en el nuevo repositorio clonado. (Saltar tronco/maestro). Para cada rama que desee mantener:

git checkout -b local_branch Origin/remote_branch

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

git remote rm Origin
1512
cmcginty

Migre limpiamente su repositorio de Subversion a un repositorio Git . Primero, debe crear un archivo que asigne los nombres de sus autores de subversión a Git commiters, digamos ~/authors.txt:

jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>

Luego, puede descargar los datos de Subversion en un repositorio 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 instalando git-core +svn.

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

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

Utilicé el script svn2git y funciona como un encanto.

69

Sugiero que se sienta cómodo con Git antes de tratar de 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 algunos pasos simples:

Inicializa el repositorio local:

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

Indica qué tan atrás quieres comenzar a importar revisiones:

git svn fetch -r42

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

En realidad buscar todo desde entonces:

git svn rebase

Puedes consultar 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 localmente su repo de SVN, es posible que desee enviarlo a un repositorio de Git centralizado para facilitar la colaboración.

Primero cree su repositorio remoto vacío (tal vez en GitHub ?):

git remote add Origin [email protected]:user/project-name.git

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

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

Después de eso, puede que te interese probar mi propia herramienta git_remote_branch, que te ayuda a lidiar con sucursales remotas:

Primer post explicativo: " Git sucursales remotas "

Seguimiento de la versión más reciente: " Time to git colaborando con git_remote_branch "

57
webmat

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

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

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

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

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

En caso de que su repositorio de Subversion contenga múltiples proyectos, entonces 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 a git-svn) y comenzar a usarlo mientras sigue manteniendo Subversion todo el tiempo que lo necesite (para sus herramientas de compilación ya configuradas, por ejemplo).

¡Espero que esto ayude!

30
Alexander Kitaev

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

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

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

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 Git creado por el primer comando.

subgit import  directory/path/Local.git.Repo

Utilicé una forma de migrar a Git instantáneamente para un enorme repositorio.
Por supuesto que necesitas un poco de preparación.
Pero no puede detener el proceso de desarrollo, en absoluto.

Aquí está mi camino.

Mi solución se ve como:

  • Migre SVN a un repositorio 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 completada solo segundos.

Por supuesto que estoy usando SubGit , mamá. git-svn me hace Pantalla azul de la muerte . Sólo constantemente. Y git-svn me aburre con el error fatal de " nombre de archivo demasiado largo " de Git.

PASOS

1. Descargar SubGit

2. Prepare los comandos de migración y actualización.

Digamos que lo hacemos para Windows (es trivial a portar a Linux).
En la instalación de un SubGit bin directorio (subgit-2.X.X\bin), cree 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 de "inicio" es opcional aquí (Windows). Permitirá ver errores al iniciar y dejar un Shell abierto después de completar el SubGit.

Puede agregar aquí parámetros adicionales similares a git-svn . Estoy usando solo - dominio predeterminado myCompanyDomain.com para arreglar el dominio de la dirección de correo electrónico de los autores de SVN.
Tengo la estructura del repositorio SVN estándar (tronco/ramas/etiquetas) y no tuvimos problemas con el "mapeo de autores". Así que ya no estoy haciendo nada.

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

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

Consejo 2 : la migración puede ser interrumpida (Ctrl + C) y restaurado ejecutando el siguiente comando/archivo de actualización.
No aconsejo hacer esto para grandes repositorios. He recibido "Fuera de memoria Java + excepción de Windows".

Sugerencia 3 : es mejor crear una copia de su resultado en el repositorio.

Contenido de un archivo/comando para actualizar:

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

Puede ejecutarlo en cualquier cantidad de veces que desee obtener los compromisos del último equipo con su repositorio Git.

¡Advertencia! No toque su repositorio simple (creación de sucursales, por ejemplo).
Tomarás el siguiente error fatal:

Error irrecuperable: no están sincronizados y no se pueden sincronizar ... Traduciendo las revisiones de Subversion a las confirmaciones de Git ...

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

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



Hay una tarea más útil.

Inserte su repositorio Git local en un repositorio Git remoto

¿Es tu caso? Vamos a proceder.

  1. Configure sus mandos a distancia

Correr:

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

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

Corramos para ello:

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 - 1 GB, etc.

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

He deshabilitado certificados .

También su servidor Git puede tener un limitaciones de cantidad de solicitud que necesitan ser corregidas .

  1. Empuje 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 anteriores de Git)

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

git Push Origin --all
git Push Origin --tags

O intenta reinstalar Git ( inútil para mí ). O puedes crear ramas de todas tus etiquetas y empujarlas. O, o, o ...

13
it3xl

reposurgeon

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

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

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

9
krlmlr

Esta guía en el sitio web de atlassian es una de las mejores que he encontrado:

https://www.atlassian.com/git/migration

Esta herramienta - https://bitbucket.org/atlassian/svn-migration-scripts - también es realmente útil para generar tus autores.txt entre otras cosas.

7
Andrew B

Tienes que instalar

git
git-svn

Copiado desde este enlace http://john.albin.net/git/convert-Subversion-to-git .

1. Recupere una lista de todos los confirmadores de Subversion

Subversion simplemente lista el nombre de usuario para cada confirmación. Los compromisos de Git tienen datos mucho más ricos, pero en su forma más simple, el autor del compromiso debe tener un nombre y un correo electrónico en la lista. Por defecto, la herramienta git-svn solo mostrará el nombre de usuario SVN en los campos de autor y correo electrónico. Pero con un poco de trabajo, puede crear una lista de todos los usuarios de SVN y cuál es su nombre y correo electrónico de Git correspondiente. Git-svn puede utilizar esta lista para transformar los nombres de usuario svn simples en los correctores de Git adecuados.

Desde la raíz de su pago local de Subversion, ejecute este comando:

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

Eso capturará todos los mensajes de registro, extraerá los nombres de usuario, eliminará cualquier nombre de usuario duplicado, ordenará los nombres de usuario y los colocará en un archivo "autores-transform.txt". Ahora edita cada línea en el archivo. Por ejemplo, convertir:

jwilkins = jwilkins <jwilkins>

dentro de esto:

jwilkins = John Albin Wilkins <[email protected]>

2. Clone el repositorio de Subversion usando git-svn

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

Esto hará la transformación estándar de git-svn (utilizando el archivoutor-transform.txt que creó en el paso 1) y colocará el repositorio de git en la carpeta “~/temp” dentro de su directorio de inicio.

3. Convierta svn: ignore propiedades a .gitignore

Si su repositorio svn estaba usando las propiedades svn: ignore, puede convertirlo fácilmente en un archivo .gitignore usando:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4. Empuje el repositorio a un repositorio de git simple

Primero, cree un repositorio simple y haga que su rama predeterminada coincida con el nombre de la rama "troncal" de svn.

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

Luego presione el repositorio temporal al nuevo repositorio simple.

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.Push 'refs/remotes/*:refs/heads/*'
git Push bare

Ahora puede eliminar de forma segura el repositorio ~/temp.

5. Cambie el nombre de la rama "troncal" a "maestro"

Su rama de desarrollo principal se llamará "troncal" que coincide con el nombre que tenía en Subversion. Querrá cambiarle el nombre a la rama "maestra" estándar de Git usando:

cd ~/new-bare.git
git branch -m trunk master

6. Limpiar ramas y etiquetas

git-svn convierte todas las etiquetas de Subversions en ramas muy cortas en Git de la forma "etiquetas/nombre". Querrás convertir todas esas ramas en etiquetas Git reales usando:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

Este paso llevará un poco de escritura. :-) Pero, no te preocupes; su shell de Unix proporcionará un indicador secundario para el comando extra largo que comienza con git para-cada-ref.

7
Valarpirai

Una respuesta un tanto extendida utilizando solo git, SVN y bash. Incluye pasos para los repositorios de SVN que no usan el diseño convencional con un diseño de directorio de troncales/ramas/etiquetas (SVN no hace absolutamente nada para imponer este tipo de diseño).

Primero use este script de bash para escanear su repo de SVN para las diferentes personas que contribuyeron y generar una plantilla para un archivo de mapeo:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <[email protected]>";
done

Use esto para crear un archivo authors en el que asigne nombres de usuario svn a nombres de usuario y correo electrónico según lo establezcan sus desarrolladores usando git config properties user.name y user.email (tenga en cuenta que para un servicio como GitHub solo es suficiente tener un correo electrónico coincidente).

Luego haga que git svn clone el repositorio svn en un repositorio git, informándole sobre la asignación:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

Esto puede llevar mucho tiempo, ya que git svn verificará individualmente cada revisión para cada etiqueta o rama que exista. (tenga en cuenta que las etiquetas en SVN son realmente sucursales, por lo que terminan como tales en Git). Puede acelerar esto eliminando las etiquetas y ramas antiguas en SVN que no necesita.

Ejecutar esto en un servidor en la misma red o en el mismo servidor también puede acelerar esto. Además, si por alguna razón este proceso se interrumpe, puedes can reanudarlo usando

git svn rebase --continue

En muchos casos has terminado aquí. Pero si su repo SVN tiene un diseño poco convencional en el que simplemente tiene un directorio en SVN que desea colocar en una rama git, puede hacer algunos pasos adicionales.

Lo más simple es simplemente hacer un nuevo repositorio SVN en su servidor que cumpla con lo convencional y use svn copy para poner su directorio en un tronco o una rama. Esta podría ser la única forma si su directorio está en la raíz del repositorio, cuando lo probé por última vez, git svn simplemente se negó a hacer un pago.

También puedes hacer esto usando git. Para git svn clone simplemente use el directorio que desea colocar en una rama git.

Despues de correr

git branch --set-upstream master git-svn
git svn rebase

Tenga en cuenta que esto requiere Git 1.7 o superior.

6
thoutbeckers

GitHub ahora tiene una función para importar desde un repositorio SVN . Aunque nunca lo intenté.

6
webmat

He publicado una guía paso a paso ( aquí ) para convertir svn en git, incluida la conversión de etiquetas svn en etiquetas git y svn en ramas git.

Version corta:

1) clone svn desde un número de revisión específico. (el número de revisión debe ser el más antiguo que desea migrar)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) buscar datos svn. Este paso es el que lleva más tiempo.

cd gitreponame
git svn fetch

repetir git svn fetch hasta que termine sin error

3) obtener la rama maestra actualizada

git svn rebase

4) Crea ramas locales a partir de ramas svn copiando referencias

cp .git/refs/remotes/Origin/* .git/refs/heads/

5) convertir las etiquetas svn en etiquetas git

git for-each-ref refs/remotes/Origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/Origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) Poner un repositorio en un lugar mejor como github

git remotes add newrepo [email protected]:aUser/aProjectName.git
git Push newrepo refs/heads/*
git Push --tags newrepo

Si desea más detalles, lea mi post o pregúnteme.

5
Pablo Belaustegui

Podemos usar los comandos git svn clone como se muestra a continuación.

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

El comando anterior creará un archivo de autores desde los confirmaciones de SVN.

  • svn log --stop-on-copy <SVN_URL>

El comando anterior le dará el primer número de revisión cuando se creó su proyecto SVN.

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

El comando anterior creará el repositorio Git en local.

El problema es que no convertirá ramas y etiquetas a Push. Tendrás que hacerlas manualmente. Por ejemplo a continuación para las ramas:

$ git remote add Origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/Origin/MyDevBranch
  remotes/Origin/tags/MyDevBranch-1.0
  remotes/Origin/trunk
$$ git checkout -b MyDevBranch Origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from Origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/Origin/MyDevBranch
  remotes/Origin/tags/MyDevBranch-1.0
  remotes/Origin/trunk
$

Para las etiquetas:

$git checkout Origin/tags/MyDevBranch-1.0
Note: checking out 'Origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from Origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/Origin/MyDevBranch
  remotes/Origin/tags/MyDevBranch-1.0
  remotes/Origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

Ahora Empuja maestro, ramas y etiquetas al repositorio de git remoto.

$ git Push Origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

utilidad svn2git

svn2git utility elimina los esfuerzos manuales con ramas y etiquetas.

Instálalo usando el comando Sudo gem install svn2git. Después de eso, ejecute debajo del comando.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

Ahora puedes listar las ramas, las etiquetas y empujarlas fácilmente.

$ git remote add Origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git Push Origin master MyDevBranch MyDevBranch-1.0

Imagina que tienes 20 ramas y etiquetas, obviamente svn2git te ahorrará mucho tiempo y por eso me gusta más que los comandos nativos. Es un envoltorio agradable alrededor del comando git svn clone nativo.

Para un ejemplo completo, consulte mi entrada de blog .

5
Pankaj

TortoiseGit hace esto. vea esta publicación del blog: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients

Sí, sé que responder con enlaces no es espléndido, pero es una solución, ¿eh?

4
CAD bloke

Para GitLab users, puse una Gist sobre cómo migré desde SVN aquí:

https://Gist.github.com/leftclickben/322b7a3042cbe97ed2af

Pasos para migrar de SVN a GitLab

Preparar

  • SVN está alojado en svn.domain.com.au.
  • Se puede acceder a SVN a través de http (otros protocolos deberían funcionar).
  • GitLab está alojado en git.domain.com.au y:
    • Se crea un grupo con el espacio de nombres dev-team.
    • Se crea al menos una cuenta de usuario, se agrega al grupo y tiene una clave SSH para la cuenta que se está utilizando para la migración (prueba usando ssh [email protected]).
    • El proyecto favourite-project se crea en el espacio de nombres dev-team.
  • El archivo users.txt contiene los detalles relevantes del usuario, un usuario por línea, de la forma username = First Last <[email protected]>, donde username es el nombre de usuario dado en los registros de SVN. (Consulte el primer enlace en la sección Referencias para obtener detalles, en particular, la respuesta del usuario Casey).

Versiones

  • Subversion versión 1.6.17 (r1128011)
  • git version 1.9.1
  • GitLab versión 7.2.1 ff1633f
  • Servidor Ubuntu 14.04

Comandos

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab [email protected]:dev-team/favourite-project.git
git Push --set-upstream gitlab master

¡Eso es! Vuelva a cargar la página del proyecto en la interfaz de usuario web de GitLab y verá todos los archivos y confirmaciones ahora en la lista.

Notas

  • Si hay usuarios desconocidos, el comando git svn clone se detendrá, en cuyo caso, la actualización users.txt, cd favourite-project y git svn fetch continuará desde donde se detuvo.
  • Se requiere el diseño trunk-tags-branches para el repositorio de SVN.
  • La URL de SVN dada al comando git svn clone se detiene en el nivel inmediatamente superior a trunk/, tags/ y branches/.
  • El comando git svn clone produce una gran cantidad de resultados, incluidas algunas advertencias en la parte superior; Ignoré las advertencias.
3
leftclickben

Si está utilizando SourceTree, puede hacerlo directamente desde la aplicación. Ir a Archivo -> Nuevo/Clonar luego haga lo siguiente:

  1. Ingrese la URL SVN remota como "Ruta/URL de origen".
  2. Introduzca sus credenciales cuando se le solicite.
  3. Introduzca la ubicación de la carpeta local como "Ruta de destino".
  4. Dale un nombre.
  5. En las opciones avanzadas, seleccione "Git" en el menú desplegable en "Crear repositorio local de tipo".
  6. Opcionalmente, puede especificar una revisión para clonar.
  7. Hit Clone.

Abra el repositorio en SourceTree y verá que sus mensajes de confirmación también se han migrado.

Ahora vaya a Repositorio -> Configuración del repositorio y agregue los nuevos detalles del repositorio remoto. Borre el control remoto SVN si lo desea (lo hice a través de la opción "Editar archivo de configuración").

Empuje el código al nuevo repositorio remoto cuando esté listo y codifique libremente.

3
Craig Myles

Recomiendo encarecidamente esta serie corta de screencasts Acabo de descubrir. El autor le guía a través de las operaciones básicas y muestra algunos usos más avanzados.

3
ripper234

Aquí hay un script de Shell simple sin dependencias que convertirá uno o más repositorios SVN a git y los empujará a GitHub.

https://Gist.github.com/NathanSweet/7327535

En aproximadamente 30 líneas de guión, clona usando git SVN, crea un archivo .gitignore desde SVN :: ignora propiedades, empuja en un repositorio git desnudo, cambia el nombre de tronco SVN a maestro, convierte etiquetas SVN a etiquetas git y lo empuja a GitHub Conservando las etiquetas.

Pasé por mucho dolor para mover una docena de repositorios SVN de Google Code a GitHub. No ayudó que usé Windows. Ruby estaba todo roto en mi vieja caja de Debian y hacer que funcionara en Windows era una broma. Otras soluciones no funcionaron con las rutas de Cygwin. Incluso una vez que conseguí que algo funcionara, no pude averiguar cómo hacer que las etiquetas se muestren en GitHub (el secreto es --follow-tags).

Al final armé dos guiones cortos y simples, vinculados arriba, y funciona muy bien. ¡La solución no necesita ser más complicada que eso!

2
NateS

Como otra cosa aparte, el comando git-stash es una bendición cuando se trata de git con git-svn dcommits.

Un proceso típico:

  1. configurar git repo
  2. hacer algún trabajo en diferentes archivos
  3. decide revisar algunos de los trabajos en, usando git.
  4. decidir a svn-dcommit
  5. obtener el error "no se puede cometer con un índice sucio".

La solución (requiere git 1.5.3+):

git stash; git svn dcommit ; git stash apply
2
Gregg Lind

Estoy en una máquina con Windows e hice un pequeño lote para transferir un repositorio SVN con historial (pero sin sucursales) a un repositorio GIT con solo llamar

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

Quizás alguien pueda usarlo. Crea una carpeta TMP comprueba el repositorio SVN allí con git y agrega el nuevo Origen y lo empuja ... y vuelve a eliminar la carpeta.

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add Origin %TO% 
git Push --set-upstream Origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

Aún necesitas los usuarios.txt con tus mapeos de usuario como

User1 = User One <[email protected]>
2
cljk

Solo quería agregar mi contribución a la comunidad Git. Escribí un simple script de bash que automatiza la importación completa. A diferencia de otras herramientas de migración, esta herramienta se basa en git nativo en lugar de jGit. Esta herramienta también admite repositorios con un gran historial de revisiones y/o grandes manchas. Está disponible a través de github:

https://github.com/onepremise/SGMS

Este script convertirá los proyectos almacenados en SVN con el siguiente formato:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

Este esquema también es popular y apoyado también:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

Cada proyecto se sincronizará por nombre de proyecto:

Ex: ./migration https://svnurl.com/basepath project1

Si desea convertir el repositorio completo, use la siguiente sintaxis:

Ex: ./migration https://svnurl.com/basepath .
1
Jason Huntley

Existen diferentes métodos para lograr este objetivo. He probado algunos de ellos y he encontrado uno realmente funcional con solo git y svn instalados en el sistema operativo Windows.

Requisitos previos:

  1. git en windows (he usado este) https://git-scm.com/
  2. svn con las herramientas de consola instaladas (he usado svn de tortuga)
  3. Volcar el archivo de su repositorio SVN. svnadmin dump /path/to/repository > repo_name.svn_dump

Pasos para lograr el objetivo final (mover todo el repositorio con historial a un git, primero a un local y luego a distancia)

  1. Cree un repositorio vacío (utilizando herramientas de consola o tortoiseSVN) en el directorio REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER, ponga dumpfile.dump en REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump Espere esta operación, puede ser larga

  3. Este comando es silencioso, así que abra la segunda ventana de cmd: svnserve -d -R --root REPO_NAME_FOLDER ¿Por qué no solo usa el archivo: /// ......? Causa El siguiente comando fallará con Unable to open ... to URL:, gracias a la respuesta https://stackoverflow.com/a/6300968/4953065

  4. Crear nueva carpeta SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn: // localhost/Espere esta operación.

Finalmente, ¿qué tenemos?

Veamos nuestro repositorio local:

git log

¿Ves tus compromisos anteriores? Si si - esta bien

Así que ahora tienes un repositorio de git local totalmente funcional con tus fuentes y el antiguo historial de svn. Ahora, si desea moverlo a algún servidor, use los siguientes comandos:

git remote add Origin https://fullurlpathtoyourrepo/reponame.git
git Push -u Origin --all # pushes up the repo and its refs for the first time
git Push -u Origin --tags # pushes up any tags

En mi caso, no necesito etiquetas porque el comando no tiene etiquetas.

¡Buena suerte!

0
Ruslan Makrenko

GitHub tiene un importador. Una vez que haya creado el repositorio, puede importar desde un repositorio existente, a través de su URL. Solicitará sus credenciales si corresponde y se irá desde allí.

A medida que se ejecuta, encontrará autores, y simplemente puede mapearlos a los usuarios en GitHub.

Lo he usado para algunos repositorios ahora, ¡y es bastante preciso y mucho más rápido también! Tomó 10 minutos para un repositorio con ~ 4000 confirmaciones, ¡y luego le tomó a mi amigo cuatro días!

0
Josh Benson

El uso efectivo de Git con Subversiones una suave introducción a git-svn. Para los repositorios SVN existentes, git-svn hace esto muy fácil. Si está iniciando un nuevo repositorio, es mucho más fácil crear primero un repositorio SVN vacío y luego importar usando git-svn que ir en la dirección opuesta. Se puede crear un nuevo repositorio de Git y luego importar en SVN, pero es un poco doloroso, especialmente si eres nuevo en Git y esperas preservar el historial de confirmación.

0
burkestar

Varias respuestas aquí se refieren a https://github.com/nirvdrum/svn2git , pero para grandes repositorios esto puede ser lento. Intenté usar https://github.com/svn-all-fast-export/svn2git en lugar de eso, es una herramienta con exactamente el mismo nombre pero se usó para migrar KDE de SVN a Git.

Un poco más de trabajo para configurarlo, pero cuando termine, la conversión en sí misma me tomó unos minutos en los que el otro script pasó horas.

0
Zitrax

Descargue el instalador de Ruby para Windows e instale la última versión con él. Añade ejecutables de Ruby a tu camino.

  • Instalar svn2git
  • Menú Inicio -> Todos los programas -> Ruby -> Iniciar una solicitud de comando con Ruby
  • Luego escribe "gem install svn2git" y escribe

    Migrar el repositorio de Subversion

  • Abra una solicitud de comando de Ruby y vaya al directorio donde se migrarán los archivos

    Luego svn2git http: // [dominio nombre]/svn/[raíz del repositorio]

  • Puede llevar algunas horas migrar el proyecto a Git dependiendo del tamaño del código del proyecto.

  • Este paso importante ayuda a crear la estructura del repositorio Git como se menciona a continuación.

    SVN (/ Project_components) trunk -> Git master SVN (/ Project_components) sucursales -> Git sucursales SVN (/ Project_components) tags -> Git tags

Crea el repositorio remoto y presiona los cambios.

0
Nanda

Usé la siguiente secuencia de comandos para leer un archivo de texto que tiene una lista de todos mis repositorios SVN y los convertí a Git, y luego usé git clone --bare para convertir a un repositorio Git simple:

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 Sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
 Sudo git clone --bare /programs/git/$repo_name $repo_name.git
 Sudo chown -R www-data:www-data $repo_name.git
 Sudo rm -rf $repo_name
done <"$file"

list.txt tiene el formato:

repo1_name
repo2_name

Y users.txt tiene el formato:

(no author) = Prince Rogers <[email protected]>

www-data es el usuario del servidor web Apache, y se necesita permiso para impulsar cambios a través de HTTP.

0
Pedro Vicente

Convertir svn submódulo/carpeta 'MyModule' en git con historial sin etiquetas ni ramas.

Para retener la lista de ignorados, utilice los comentarios anteriores después del paso 1

0
PShetty