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


He leído el manual de Git, FAQ, curso intensivo Git-SVN, etc. y todos explican esto y aquello, pero en ninguna parte se puede encontrar una instrucción simple como:

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

Repositorio 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 trate de explicar nada, solo de decir qué pasos tomar dado este ejemplo.

Author: Milan Babuškov, 2008-09-17

30 answers

Magia:

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

Git y SVN operan de manera muy diferente. Necesitas aprender Git, y si quieres hacer un seguimiento de los cambios desde SVN upstream, necesitas aprender git-svn. La página de manual de git-svn tiene una buena sección de ejemplos:

$ git svn --help
 498
Author: jfm3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-16 15:42:39

Crear 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 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 SVN faltante que no esté en el archivo. Pero después de eso, puede actualizar el archivo y continuar donde lo dejó.

Ahora extrae 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 la bandera "st stdlayout" implica que tiene el diseño SVN común "trunk/, branches/, tags/". Si su diseño difiere, familiarícese con --tags, --branches, --trunk opciones (en general git svn help).

Se permiten todos los protocolos comunes: svn://, http://, https://. La URL debe dirigirse 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 muy a menudo parece que la operación está "colgando / freezed", y es bastante normal que se pueda bloquear durante mucho tiempo 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 la bandera --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

Usted podría tenga que repetir el último comando varias veces, si tiene un proyecto grande, hasta que todas las confirmaciones de Subversion hayan sido recuperadas:

git svn fetch

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

git branch -r

Si desea mantener otras ramas remotas en su repositorio, desea crear una rama local para cada una manualmente. (Skip trunk / master.) Si no haces esto, el 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

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

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

Las ramas locales que creó anteriormente desde ramas remotas solo se habrán copiado como ramas remotas en el nuevo repositorio clonado. (Skip trunk / master.) Para cada rama usted quiere mantener:

git checkout -b local_branch origin/remote_branch

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

git remote rm origin
 1480
Author: cmcginty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-15 09:36:14

Migre Limpiamente Su Repositorio Subversion A un Repositorio Git . Primero tienes que crear un archivo que asigne los nombres de autor de tus commits de Subversion a los commiters de Git, por ejemplo ~/authors.txt:

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

Entonces 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 un Mac, puedes obtener git-svn de MacPorts instalando git-core +svn.

Si su repositorio subversion está en la misma máquina que su repositorio git deseado, a continuación, puede utilizar esta sintaxis para el init step, de lo contrario todo lo mismo:

git svn init file:///home/user/repoName --no-metadata
 184
Author: zoul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-31 23:08:52

He utilizado el script svn2git y funciona como un encanto! https://github.com/nirvdrum/svn2git

 67
Author: Thiago Leão Moreira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-01 07:53:50

Sugiero que se sienta 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 obtener todo desde entonces:

git svn rebase

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

gitk

Cuando tengas tu repositorio SVN clonado localmente, es posible que quieras enviarlo a un repositorio Git centralizado para facilitar la colaboración.

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

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

Entonces, opcionalmente sincroniza tu rama principal para que la operación pull combine automáticamente el maestro remoto con tu maestro local, cuando ambos contengan nuevo cosas:

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

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

Primer post explicativo: " Ramas remotas de Git "

Seguimiento de la versión más reciente: " Tiempo para que git colabore con git_remote_branch "

 56
Author: webmat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-18 17:00:54

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 algo de Subversion y hasta ahora funciona muy bien.

Para migrar de Subversion a Git con SubGit necesitas ejecutar:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

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

En caso de que su repositorio Subversion contenga varios proyectos, entonces se crearán varios 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 su ya herramientas de compilación configuradas, por ejemplo).

Espero que esto ayude!

 29
Author: Alexander Kitaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-24 20:12:41

Ver la página de manual oficial de git-svn. En particular, mira 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
Author: EfForEffort,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-06 15:38:32
 13
Author: kpd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-17 16:19:10

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

Usé una forma de migrar a Git instantáneamente para un repositorio enorme.
Por supuesto que necesitas un poco de preparación.
Pero es posible que no se detenga el proceso de desarrollo, en absoluto.

Este es mi camino.

Mi solución se ve así:

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

La migración toma mucho tiempo para un repositorio SVN grande.
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 está aburriendo con el "nombre de archivo demasiado largo" fatal de Git error.

PASOS

1. Descargar SubGit

2. Prepare los comandos migrar y actualizar.

Digamos que lo hacemos para Windows (es trivial portar a Linux).
En el directorio de instalación bin de un subgit (subgit-2.X. X \ bin), crear 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 "start" es opcional aquí (Windows). Permitirá ver errores en 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 default default-domain myCompanyDomain.com para fijar el dominio de la dirección de correo electrónico de los autores de SVN.
Tengo la estructura del repositorio SVN estándar (trunk / branches / tags) y no tuvimos problemas con "authors mapping". Así que ya no estoy haciendo nada.

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

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

Consejo 2 : La migración puede interrumpirse (Ctrl + C ) y se restaura mediante la ejecución de la siguiente actualización comando/archivo.
No aconsejo hacer esto para grandes repositorios. He recibido "Excepción de Java+Windows fuera de memoria".

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

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 Git.

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

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

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

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 de su equipo de desarrollo a Git.
Sólo tomará unos segundos.



Hay una tarea útil más.

Envía tu repositorio Git local a un repositorio Git remoto

¿Es tu caso? Procedamos.

  1. Configura tus controles remotos

Ejecutar:

$ 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 se colgó inesperadamente

Vamos a correr por él:

git config --global http.postBuffer 1073741824

524288000-500 MB 1073741824 - 1 GB, etc.

Soluciona los problemas de tu certificado local . Si tu git-server utiliza un certificado roto.

He deshabilitado certificados .

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

  1. Envía toda la migración al control remoto del equipo Repositorio Git.

Ejecutar con un Git local:

git push origin --mirror

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

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

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

O intenta reinstalar Git (inútil para mí ). O puede crear ramas a partir de todas sus etiquetas y empujarlas. O, o, o...

 12
Author: it3xl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:30

Reposurgeon

Para casos complicados, reposurgeon por Eric S. Raymond es la herramienta de elección. Además de SVN, soporta 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 de SVN svn:ignore a archivos .gitignore) incluso para diseños de repositorio difíciles con una larga historia. En muchos casos, otras herramientas podrían 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 repasa el proceso de conversión paso a paso.

 8
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 21:34:36

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 muy útil para generar sus autores.txt, entre otras cosas.

 7
Author: Andrew B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-13 13:58:34

Una respuesta algo extendida usando solo git, SVN y bash. Incluye pasos para repositorios SVN que no utilizan el diseño convencional con un diseño de directorio trunk/branches/tags (SVN no hace absolutamente nada para imponer este tipo de diseño).

Primero use este script bash para escanear su repositorio SVN para las diferentes personas que contribuyeron y para generar una plantilla para un archivo de asignación:

#!/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 <USER@DOMAIN>";
done

Use esto para crear un archivo authors donde mapee nombres de usuario svn a nombres de usuario y correo electrónico según lo establecido por sus desarrolladores utilizando git config propiedades user.name y user.email (tenga en cuenta que para un servicio como GitHub solo es suficiente tener un correo electrónico coincidente).

Entonces tienen git svn clona el repositorio svn a un repositorio git, contá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 revisará individualmente cada revisión para cada etiqueta o rama que exista. (tenga en cuenta que las etiquetas en SVN son solo ramas, por lo que terminan como tal 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, puede reanudarlo usando

git svn rebase --continue

En muchos casos ya has terminado aquí. Pero si su repositorio SVN tiene un diseño no convencional donde simplemente tiene un directorio en SVN que desea poner en una rama de git, puede realizar algunos pasos adicionales.

Lo más simple es simplemente hacer un nuevo repositorio SVN en su servidor que siga la convención y use svn copy para poner su directorio en trunk o una rama. Esta podría ser la única manera si su directorio está todo el camino en la raíz del repositorio, la última vez que probé esto git svn simplemente se negó a hacer un checkout.

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

Después de ejecutar

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

Tenga en cuenta que esto requiere Git 1.7 o superior.

 6
Author: thoutbeckers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-29 10:41:21

, tienes Que Instalar

git
git-svn

Copiado de este enlace http://john.albin.net/git/convert-subversion-to-git .

1. Recuperar una lista de todos los committers de Subversion

Subversion simplemente lista el nombre de usuario para cada confirmación. Las confirmaciones de Git tienen datos mucho más ricos, pero en su forma más simple, el autor de la confirmación necesita tener un nombre y un correo electrónico listados. De forma predeterminada, la herramienta git-svn solo mostrará el nombre de usuario SVN en los campos autor y correo electrónico. Pero con una un poco de trabajo, puede crear una lista de todos los usuarios de SVN y cuáles son sus correspondientes nombres de Git y correos electrónicos. Esta lista puede ser utilizada por git-svn para transformar nombres de usuario svn simples en committers Git adecuados.

Desde la raíz de su checkout 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

Que tomará todos los mensajes de registro, arrancará los nombres de usuario, eliminará cualquier nombre de usuario duplicado, ordenará los nombres de usuario y los colocará en una "transformación de autores".txt archivo". Ahora edita cada línea en archivo. Por ejemplo, convert:

jwilkins = jwilkins <jwilkins>

En esto:

jwilkins = John Albin Wilkins <[email protected]>

2. Clona 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 git-svn (usando authors-transform.archivo txt que creaste en el paso 1) y coloca el repositorio git en la carpeta "~/temp" dentro de tu directorio personal.

3. Convertir svn: ignorar propiedades a .gitignore

Si su repositorio svn estaba usando las propiedades svn:ignore, puede convierte fácilmente esto a a .archivo gitignore usando:

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

4. Push repository to a bare git repository

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

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

Luego empuje el repositorio temporal al nuevo repositorio desnudo.

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. Cambiar el nombre de la rama "trunk" a"master"

Su rama de desarrollo principal será nombrada "trunk" que coincide con el nombre que tenía en Subversion. Querrás cambiarle el nombre a la rama estándar "master" 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 "tags/name". 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 tomará un poco de escritura. :- ) Pero, no se preocupe; su shell unix proporcionará un > secundario prompt para el comando extra largo que comienza con git for-each-ref.

 6
Author: Valarpirai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-22 04:36:33

GitHub ahora tiene una característica para importar desde un repositorio SVN. Pero nunca lo intenté.

 5
Author: webmat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-21 02:15:07

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á el archivo authors a partir de las confirmaciones 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 hacerlo manualmente. Por ejemplo abajo 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 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 envía master, ramas y etiquetas al repositorio 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
$

Svn2git utility

La utilidad Svn2git elimina los esfuerzos manuales con ramas y etiquetas.

Instálelo usando el comando sudo gem install svn2git. Después de eso, ejecute el comando debajo.

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

Ahora puede enumerar 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 tags, obviamente svn2git te ahorrará mucho tiempo y es por eso que me gusta más que los comandos nativos. Es un buen envoltorio alrededor del comando nativo git svn clone.

Para un ejemplo completo, consulte mi entrada de blog .

 5
Author: Pankaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-02 16:13:49

TortoiseGit hace esto. ver esta entrada 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
Author: CAD bloke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-18 03:41:17

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 ramas svn en ramas git.

Versión corta:

1) clona svn de 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) obtener datos svn. Este paso es el que lleva más tiempo.

cd gitreponame
git svn fetch

Repita git svn fetch hasta que finalice sin error

3) obtener rama maestra actualizado

git svn rebase

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

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

5) convertir 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 quieres más detalles, lee mi post o pregúntame.

 4
Author: Pablo Belaustegui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-25 20:27:14

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

 3
Author: ripper234,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-22 00:34:48

Si está utilizando SourceTree, puede hacerlo directamente desde la aplicación. Goto File - > New / Clone luego haga lo siguiente:

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

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

Ahora vaya a Repositorio -> Configuración del repositorio y agregue los nuevos detalles del repositorio remoto. Elimine 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
Author: Craig Myles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-17 04:43:33

Como otro aparte, el comando git-stash es un regalo del cielo 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 parte del trabajo usando git
  4. decide svn-dcommit
  5. obtenga el temido error "no se puede confirmar con un índice sucio".

La solución (requiere git 1.5.3+):

git stash; git svn dcommit ; git stash apply
 2
Author: Gregg Lind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-26 13:13:26

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

Https://gist.github.com/NathanSweet/7327535

En unas 30 líneas de script: clona usando git SVN, crea un .gitignore archivo de SVN:: ignore propiedades, empuja en un repositorio git desnudo, cambia el nombre del tronco SVN a maestro, convierte las etiquetas SVN a etiquetas git, y lo empuja a GitHub mientras conserva las etiquetas.

Fui a través de un montón de dolor para mover una docena de repositorios SVN de Google Code a GitHub. No ayudó que usara Ventanas. Ruby estaba todo tipo de roto en mi vieja caja de Debian y hacer que funcionara en Windows era una broma. Otras soluciones no funcionaban con rutas Cygwin. Incluso una vez que tenía algo funcionando, no podía averiguar cómo conseguir que las etiquetas aparecieran en GitHub (el secreto es follow las etiquetas de seguimiento).

Al final improvisé dos guiones cortos y simples, enlazados arriba, y funciona muy bien. Solución no tiene por qué ser más complicado que eso!

 2
Author: NateS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-06 14:11:59

Para los usuarios de GitLab he puesto un gist sobre cómo migré desde SVN aquí:

Https://gist.github.com/leftclickben/322b7a3042cbe97ed2af

Pasos para migrar de SVN a GitLab

Configuración

  • SVN está alojado en svn.domain.com.au.
  • SVN es accesible 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.
    • Al menos una cuenta de usuario es creado, agregado al grupo, y tiene una clave SSH para la cuenta que se está usando 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 de usuario relevantes, un usuario por línea, de la forma username = First Last <[email protected]>, donde username es el nombre de usuario dado en SVN logs. (Vea el primer enlace en la sección de Referencias para más detalles, en particular la respuesta del usuario Casey).

Versiones

  • versión de subversion 1.6.17 (r1128011)
  • git versión 1.9.1
  • [36]} GitLab versión 7.2.1 ff1633f
  • Ubuntu server 14.04

Órdenes

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 todo! Vuelva a cargar la página del proyecto en la interfaz de usuario web de GitLab y verá todas las confirmaciones y archivos ahora listados.

Notas

  • Si hay usuarios desconocidos, el comando git svn clone se detendrá, en cuyo caso, actualizar users.txt, cd favourite-project y git svn fetch continuará desde donde se detuvo.
  • El estándar trunk-tags-branches se requiere diseño para el repositorio SVN.
  • La URL SVN dada al comando git svn clone se detiene en el nivel inmediatamente superior trunk/, tags/ y branches/.
  • El comando git svn clone produce una gran cantidad de salida, incluyendo algunas advertencias en la parte superior; ignoré las advertencias.
 2
Author: Xharze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-04 21:21:16

Solo quería añadir mi contribución a la comunidad de Git. Escribí un script bash simple 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 soporta repositorios con un gran historial de revisiones y / o grandes blobs. 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 es también popular y apoyado también:

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

Cada proyecto se sincronizará por el nombre del 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
Author: Jason Huntley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-16 18:28:52

Im en una máquina windows e hizo un pequeño lote para transferir un repositorio SVN con historial (pero sin ramas) a un repositorio GIT simplemente llamando a

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

Tal vez cualquiera pueda usarlo. Crea una carpeta TMP que comprueba el repositorio SVN allí con git y agrega el nuevo origen y lo empuja... y elimina la carpeta de nuevo.

@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%

Todavía necesita los usuarios.txt con tus asignaciones de usuario como

User1 = User One <[email protected]>
 1
Author: cljk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-06 06:37:45

Usando efectivamente Git con Subversion es una introducción suave a git-svn. Para los repositorios SVN existentes, git-svn hace esto súper fácil. Si está comenzando un nuevo repositorio, es mucho más fácil crear primero un repositorio SVN vacío y luego importarlo usando git-svn que ir en la dirección opuesta. Se puede crear un nuevo repositorio Git y luego importarlo a SVN, pero es un poco doloroso, especialmente si eres nuevo en Git y esperas preservar la confirmación historia.

 0
Author: burkestar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 21:20:47

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

  • Instalar svn2git
  • Menú Inicio - > Todos los programas - > Ruby - > Iniciar un símbolo del sistema con Ruby
  • Luego escriba "gem install svn2git" e ingrese

    Migrar el repositorio de Subversion

  • Abra un símbolo del sistema de Ruby y vaya al directorio donde se migrarán los archivos

    Entonces svn2git http: / / [domain name] / svn / [repository root]

  • Puede tardar unas horas en 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 Ramas SVN (/Project_components) branches > Ramas Git SVN (/Project_components) tags > > Git tags

Crear el repositorio remoto y empuja los cambios.

 0
Author: Nanda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 21:28:44

GitHub tiene un importador. Una vez que haya creado el repositorio, puede importar desde un repositorio existente, a través de su URL. Le pedirá sus credenciales si corresponde e irá a partir de ahí.

Mientras se ejecuta, encontrará autores, y simplemente puede asignarlos a 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 después tomó mi amigo cuatro días!

 0
Author: Josh Benson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 21:30:42

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

Un poco más de trabajo para configurarlo, pero cuando se hizo la conversión en sí para mí tomó minutos donde el otro script pasó horas.

 0
Author: Zitrax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-19 14:17:52

Existen diferentes métodos para lograr este objetivo. He probado algunos de ellos y encontré que realmente funciona 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 herramientas de consola instaladas (he usado tortoise svn)
  3. Archivo de volcado 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, en primer lugar git local, luego remoto)

  1. Crear un repositorio vacío (usando herramientas de consola o TortoiseSVN) en el directorio REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER, poner dumpfile.dump into REPO_NAME_PARENT_FOLDER

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

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

  4. Crear una nueva carpeta SOURCE_GIT_FOLDER

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

Finalmente, ¿qué tenemos?

Veamos nuestro repositorio local:

git log

¿Ves tus confirmaciones anteriores? En caso afirmativo - aceptable

Así que ahora tienes un repositorio git local completamente funcional con tus fuentes y el antiguo historial svn. Ahora, si quieres moverlo a algunos servidor, utilice 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 el comando tags porque mi repositorio no tiene etiquetas.

¡Buena suerte!

 0
Author: Ruslan Makrenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:32

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

Para conservar la lista de ignorados svn use los comentarios anteriores después del paso 1

 0
Author: PShetty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-07 16:02:29