2009-03-24 11 views
25

Estoy usando git-svn para almacenar una versión "en etapas" de algunos repositorios SVN, donde otros usuarios pueden extraer de este repositorio de etapas y confirmar que hay cambios en él, luego el los commits en el repo de puesta en escena se comprometen periódicamente el repo upstream SVN.Mapeo entre los commiters de git y los usuarios de SVN

Quiero saber si hay una manera de mapear entre los nombres de los committers de git y los nombres de usuario de SVN, para que su información se mantenga intacta al volver al repositorio de SVN?

Respuesta

24

Vincent Danen menciona the -A option when using git svn:

Así, utilizando ~/git como un directorio de nivel superior para los repositorios Git [...] crear un archivo authors.txt.
Este archivo asignará los nombres de los committers de Subversion a los autores de Git, lo que dará como resultado un historial correcto del repositorio de Subversion importado.
Para proyectos con un pequeño número de committers, esto es bastante fácil. Para proyectos más grandes con muchos committers, esto puede tomar algo de tiempo. La sintaxis del archivo sería:

user = Joe User <[email protected]> 
vdanen = Vincent Danen <[email protected]> 

El nombre corto es el nombre del confirmador para Subversion mientras que la forma larga es el nombre y dirección de correo electrónico completa del usuario, tal como se utiliza por Git.

El último paso es clonar el repositorio de Subversion, que crea un repositorio de Git local basado en él. Asumiendo que su repositorio utiliza los estándares de/tronco,/etiquetas y/ramas, uso:

# git svn clone --no-metadata -A authors.txt -t tags -b branches -T trunk https://svn.example.com/svn/repo 

-A<filename> 
--authors-file=<filename> 

sintaxis es compatible con el archivo utilizado por Git-cvsimport:

loginname = Joe User <[email protected]> 

Si se especifica esta opción y git-svn encuentra un nombre de commiter SVN que no existe en los autores -file, git-svn abortará la operación.
El usuario tendrá que agregar la entrada correspondiente.
Al volver a ejecutar el comando git-svn anterior después de que se modifique el archivo de autores, debe continuar la operación.

config key: svn.authorsfile 

Esto debería funcionar para todas las git-svn comandos, incluyendo git-svn dcommit (cuando se presiona - SVN) (Nota: No he probado directamente sin embargo).

Mohammed Gamal informa (en los comentarios) funciona, pero sin la opción --no-metadata.

+1

Eso también funciona en la dirección git-> svn, como lo pidió OP? –

+0

@Christoph: por cierto, * haz * un espejo SVN de un repositorio de Git (http://stackoverflow.com/questions/570945/git-clone-of-git-svn-tree/571084#571084). ¿Alguna vez tuvo que usar la opción --authors-file? – VonC

+2

Su solución funciona, pero sin --no-metadata switch –

1

una segunda opción es proporcionar un programa/script que resuelva el mapeo.

Muy útil si se desconoce el número de committers, pero se podría "generar" desde el nombre del comisionado SVN.

Si ... nombre del comisionado SVN que no existe en el archivo de autores, git svn abortará la operación. El usuario tendrá que agregar la entrada apropiada. Volver a ejecutar el comando anterior git svn autores después de que el archivo se modifica ...

así, para ello tenemos:

--authors-prog=mapMyCompanyUsers.sh 

para no tener fuerza de cada usuario a la comprobación/rizo/wget'ting la mapa-script en primer lugar, que podría proporcionar algo como esto:

$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile) 

El clon se verá así:

$ git svn clone -s --authors-prog=$(tmpMapFile="$TMPDIR/mapSvnUsersAutomatically.$$.sh" && echo -e '#!/bin/sh\necho $1" <"$1"@example.com>"' > $tmpMapFile && chmod +x $tmpMapFile && echo $tmpMapFile) https://svn.example.com/svn/repo/ 

Esto obligará a todas las asignaciones son exactamente iguales y los clones SVN podrían ser "compartidos" y fusionados a través de git!

Cuestiones relacionadas