1010 votos

Migrar el repositorio SVN con la historia a un nuevo repositorio Git

He leído el Git manuales, FAQ, Git - SVN curso intensivo, etc. y todos ellos explicar esto y aquello, pero en ningún lugar se puede encontrar una instrucción simple 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 así de simple, y no espero que sea un solo comando. Pero no tengo que esperar que no se trate de explicar nada, sólo decir los pasos a seguir dado este ejemplo.

1111voto

Casey Puntos 19286

Crear un archivo de usuarios (es decir. users.txt) para la asignación de SVN a los usuarios de GIT:

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

SVN se detendrá si se encuentra con una falta de SVN del usuario, no en el archivo. Pero después de que usted puede actualizar el archivo y pick-up donde la dejaste.

Ahora tire de la SVN datos de la repo:

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

Este comando creará un nuevo repositorio git en dest_dir-tmp y empezar a tirar de la SVN repo. Tenga en cuenta que el "--stdlayout" bandera implica que tienen en común "trunk/branches/tags" svn diseño. Si su diseño es diferente, familiarizarse con --tags, --branches, --trunk opciones (en general, git svn help).

Todos commons protocolos están permitidos : svn://, http://, https://. La dirección url debe apuntar a la base del repositorio, algo así como http://svn.mycompany.com/myrepo/repository. Que debe no incluyen /trunk, /tag o /branches.

Si un nombre de usuario no se encuentra, la actualización, users.txt archivo:

cd dest_dir-tmp
git svn fetch

Usted podría tener que repetir este último comando varias veces, si usted tiene un proyecto grande, hasta que todos los de la Subversión se compromete han sido obtenidos:

git svn fetch

Cuando se haya completado, git checkout SVN trunk en una nueva rama. Cualquier de las otras ramas programa de instalación como mandos a distancia. Usted puede ver las otras ramas del SVN con:

git branch -r

Si desea evitar que otras ramas remotas en su repo, desea crear una sucursal local para cada uno de forma manual. Si usted no hace esto, las ramas no obtener clonado 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 son importados como ramas. Usted tiene que crear una sucursal local, hacer un tag y eliminar la rama de contar con ellos como etiquetas en git. Para hacerlo con la etiqueta de "v1":

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

Clon de su GIT-SVN repo en limpio con un repositorio git:

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

En las oficinas locales que creó anteriormente de sucursales remotas sólo han copiado como sucursales remotas en el nuevo repositorio clonado. Para cada rama que desea mantener:

git checkout -b local_branch origin/remote_branch

Por último, eliminar el control remoto de la limpieza repositorio git que señala el ahora suprimido temp repo:

git remote rm origin

358voto

jfm3 Puntos 13666

Magia:

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

Git y SVN funcionan de manera muy diferente. Usted necesita aprender Git, y si desea realizar un seguimiento de los cambios de SVN aguas arriba, usted necesita aprender git-svn. La git-svn página man tiene una buena sección de ejemplos:

$ git svn --help

148voto

Eugene Yokota Puntos 43213

Limpiamente Migrar el Repositorio de Subversion A un Repositorio Git. Primero tienes que crear un archivo de mapas de Subversion cometer los nombres de los autores a Git commiters, digamos ~/authors.txt:

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

A continuación, puede descargar la Subversión de datos 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 un Mac, usted puede obtener git-svn de MacPorts instalando git-core +svn.

Si su repositorio de subversion está en el mismo equipo como desea en las repositorio de git, a continuación, puede utilizar esta sintaxis para el inicio del paso, de lo contrario, todas de la misma:

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

56voto

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

44voto

webmat Puntos 13359

Yo sugeriría conseguir cómodo con Git antes de intentar usar git-svn constantemente, es decir. mantener SVN como la centralización de los repos y el uso de Git local.

Sin embargo, para una migración sencilla con toda la historia, aquí están algunos pasos simples:

Inicializar el local de la repo:

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

La marca que desea para iniciar la importación de las revisiones:

git svn fetch -r42

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

En realidad, recuperar todo lo que desde entonces:

git svn rebase

Usted 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 tienes tu SVN repo clonado a nivel local, usted puede querer empuje a una centralizado repositorio Git para facilitar la colaboración.

En primer lugar crea tu vacío remoto repo (tal vez en GitHub?):

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

A continuación, opcionalmente sincronización de su rama principal por lo que la operación de extracción automáticamente combinar el maestro a distancia con tu maestro, cuando ambos contienen cosas nuevas:

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

Después de eso, usted puede estar interesado en probar mi propia git_remote_branch herramienta, la cual le ayuda a tratar con sucursales remotas:

Primer puesto de motivos: "Git remote ramas"

De seguimiento para la versión más reciente: "Tiempo para git colaborar con git_remote_branch"

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X