2011-02-03 13 views
19

Soy un usuario de git de poder y feliz en eso.Configuración de git svn sin problemas

Ahora, estoy obligado a usar svn y no estoy exactamente feliz de hacerlo. No es tan cómodo usar git svn todavía.

Así que, aquí está la configuración que me gustaría y quiero.

  • Uso un git repo, que es git en todos los sentidos con muchas sucursales locales.
  • Creo varias ramas en git regularmente y me fusiono, deja que git maneje todo.
  • Deseo enviar la rama git seleccionada como una rama svn con todo duplicado.
  • Cuando elimino una rama git localizada en svn, la rama svn también se elimina.

El punto de subrayado es que, quiero que git haga todo el trabajo de fusionar y ramificar y simplemente presionar al svn y convertirlo en una tienda.

Parece que estoy pidiendo un tutorial de git-svn. Excepto que he ido a buscarlos muchas veces y, sin embargo, me enfrento a errores mientras hago git svn rebase y git svn commit muy a menudo y siempre parece hablar solo con el maletero.

Lo que quiero es duplicar comandos svn enviados y ramas duplicadas.

+0

¿Cómo configuró su git-svn repo? ¿Está rastreando las convenciones estándar de trunk/tag/branch svn **? –

Respuesta

28

ver this question para una introducción a git svn branch y that question de cómo eliminar las sucursales remotas - o por debajo de un resumen completo de los fundamentos de la git svn (incluyendo la información de las dos cuestiones mencionadas).

Para darle un tutorial más completo (la configuración completa para cubrir sucursales locales y remotas, comprometer, fusionar sucursales locales - ver debajo de la línea horizontal para la configuración de sucursales), aquí se explica cómo trabajar fácilmente con un svn repo:

  • inicializar el repositorio git local con git svn clone <url>, ya sea con parametro -s (stdlayout) o con los parámetros --trunk, --tags, --branches para especificar el directorio del tronco, las ramas y las etiquetas dentro del dir sVN.

-s medios, el repositorio SVN tiene una estructura de directorios como éste

/trunk 
/branches/new_feature 
/branches/long_fix 
/tags/0.0.9 
/tags/0.1.0 

Si no es así, se puede especificar la ubicación de la tronco, ramas y etiquetas con los argumentos presentados encima.

Al clonar el repositorio, automáticamente se le aterrizar en una rama local llamado maestro, que hará un seguimiento de forma automática el tronco .

En esto, lo hace sus compromete al igual que usted no sabría ha clonado el repositorio con git svn, excepto que no empujar compromete:

  • Uso git commit hacer commit en su sucursal
  • utilice git branch <branch name> para crear ramas locales
  • Use git merge <branch name> fusionar los cambios de las secciones locales
  • etc.

Usted no necesita preocuparse de que estás en un -repo git svn, hasta que desee transferir los cambios.

Desde la configuración anterior, tenemos la rama local de maestro que está rastreando tronco. Así que después de hacer commit en el interior del local de maestro -branch, pueden ser empujados a la tronco con el siguiente comando:

  • git svn dcommit (dentro de su local de la rama principal )

(Tenga en cuenta d en dcommit).

Para probar donde se compromete iría, hacer

  • git svn dcommit -n

Ahora viene la parte interesante: crear ramas de su lado que se realiza un seguimiento. Muy simple lectura the question above, sólo voy a copiar y pegar el ejemplo:

  • git svn branch -n -m "Branch for authentication bug" auth_bug

Tenga en cuenta que este ejemplo tiene la bandera -n que sólo hace un simulacro. Quita esa bandera para hacerlo de verdad. El comando crea el auth_bug rama en el repositorio SVN en las ramas -directory que ha configurado anteriormente y

  • git checkout -b auth_bug auth_bug

crea una rama local auth_bug (primer parámetro) y deja que siga la rama remota auth_bug (segundo param), que se asigna al directorio /branches/auth_bug en el repositorio svn. La rama remota auth_bug existe, porque la creó con el comando git svn branch (y podría ser cualquier otra rama ya existente).

Dentro de esta rama local auth_bug, todas sus confirmaciones serán empujados al repositorio SVN en las ramas dir /branches/auth_bug al hacer git svn dcommit (probarlo añadiendo -n al comando.)

Para eliminar una rama (no he hecho antes), parece que git svn no maneja esto para usted, por lo que de acuerdo a another question, usted tiene que a la siguiente directamente utilizando el comando svn:

  • svn rm $URL/branches/the_branch

Esto elimina la rama desde el repositorio SVN a distancia, y luego hay que eliminarlo de su repositorio git locales, dependiendo de que era una rama (como en el comando anterior) o una etiqueta:

git branch -D -r the_branch 
rm -rf .git/svn/the_branch 

o

git branch -D -r tags/the_tag 
rm -rf .git/svn/tags/the_tag 

para actualizar su rama con los cambios de la rama sVN aguas arriba ("pull"), se puede reajustar su sucursal en la parte superior del cambio con:

  • git svn rebase

Esto obtiene nuevas confirmaciones en SVN, rebasa su sucursal y reproduce sus commits locales (si las hay).

+0

Awesome gracias! Supongo que todavía puedo empujar las ramas de git, incluido el maestro, a otros repositorios de git, si no quiero lidiar con svn mientras tanto. Y el git svn rebase rebase los commits actuales en el master en base a lo que estaba en el trunk. –

+0

También puede ser útil agregar el parámetro --prefix al clonar para que no tenga problemas con las sucursales locales que tengan el mismo nombre que las sucursales remotas en el futuro: 'git svn clon --prefix = ' Tiendo a usar" svn/"como prefijo para que todas mis ramas remotas sean" svn/somthing " –

+2

¿Qué pasa si quiero" extraer "del svn? ¿Cómo puedo hacer eso? –

3

Intead de git-svn puede probar SubGit.

SubGit es un espejo bidireccional del lado del servidor Git-SVN.

Si usted tiene acceso local al repositorio de Subversion, puede instalar SubGit en ella al igual que este:

$ subgit configure $SVN_REPOS 
# Adjust $SVN_REPOS/conf/subgit.conf to specify your branches and tags 
# Adjust $SVN_REPOS/conf/authors.txt to specify git & svn authors mapping 
$ subgit install $SVN_REPOS 
... 
$ INSTALLATION SUCCESSFUL 

SubGit convierte depósito de la subversión en Git (funciona en la dirección opuesta también) e instala SVN y Git manos. Como resultado, los repositorios de Subversion y Git están sincronizados: cada confirmación y envío inicia ganchos que convierten las modificaciones entrantes de inmediato.

Éstos son algunos de los beneficios de la utilización de SubGit:

  1. SubGit convierte automáticamente el svn: ignore propiedades en archivos .gitignore, svn: eol-estilo y SVN: propiedades de tipo MIME para .gitattributes;

  2. SubGit convierte automáticamente la información de seguimiento de fusión del repositorio de Git a las actualizaciones de propiedad de svn: mergeinfo;

  3. Se puede usar cualquier cliente de Git para trabajar con el repositorio de Git alimentado por SubGit, todos los cambios se propagan inmediatamente a la contraparte de Subversion.

Para más detalles, se refieren a SubGit documentation y git-svn página de comparación.

y aquí está la descripción de la forma estándar de operaciones Git se reflejan en el repositorio Subversion:

  1. Crear rama foo y lo empuja al repositorio Git originales:

    $ git checkout -b foo master 
    $ git commit -a -m "Implement feature foo" 
    $ git push origin foo 
    

    Tan pronto como el empuje está hecho, el repositorio de Subversion obtiene ^/branches/foo rama copiada de ^/trunk con el modificador apropiado aciones.

  2. rama Combinar foo a maestro: Actualización de info de fusión::

    $ git checkout master 
    $ git merge foo 
    $ git push 
    

    En este momento una nueva revisión creada para la rama ^/tronco con las modificaciones apropiadas, incluyendo SVN

    + /branches/foo:rX-rY 
    
  3. Eliminar la bifurcación del depósito remoto:

    $ git push origin +:refs/heads/foo 
    

    Después de que ^/ramas/foo se suprime en el repositorio SVN.

SubGit es un producto comercial. Es gratis para proyectos de código abierto y académicos y también para proyectos con hasta 10 committers.

Descargo de responsabilidad: Soy uno de los desarrolladores de SubGit.

+0

¿Qué significa la variable '$ SVN_REPOS'? –

+1

@IgorGanapolsky '$ SVN_REPOS' es una ruta al directorio del repositorio de Subversion. Tenga en cuenta que esta respuesta está un poco desactualizada, SubGit ahora admite el modo espejo remoto que no requiere acceso local al repositorio de Subversion. Para obtener más información sobre este modo, consulte la documentación de SubGit: http://www.subgit.com/remote-book.html – vadishev