2008-12-08 26 views
51

El tratamiento de mi repositorio como un repositorio SVN, me sale:¿Cómo mantengo un svn: external actualizado usando git-svn?

svn co http://myrepo/foo/trunk foo 
... 
foo/ 
    bar/ 
    baz/ -> http://myrepo/baz/trunk 

tratándolo como un repositorio git, me sale:

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags 
... 
foo/ 
    bar/ 

puedo clonar Baz a mi máquina local en otro lugar y añadir un enlace simbólico , pero eso es solo un truco. ¿Hay alguna manera de hacer que git svn rebase automáticamente haga esos cambios cuando actualiza todo lo demás, como lo hace svn up?

+0

Sé que he leído en alguna parte acerca de cómo configurar esto con submódulos git, pero no puedo encontrar la enlazar. – JesperE

Respuesta

22

La solución que terminé usando fue solo para enlazar a otros clones git-svn en mi cuadro local. Esto funcionó bastante bien: me permite confirmar los cambios, y me permite hacer cambios locales en el proyecto A solo para incluirlos en el proyecto B.

24

La mejor manera de integrar los externos SVN con git-svn que yo he visto es este script, que clona sus externos en un .git_externals/y crea los enlaces simbólicos y excluir archivos que necesita. Encuentro esto una solución simple y directa. YMMV.

Aquí hay un older overview de otras opciones para tratar con svn externals con git-svn. Para mí, se ven un poco demasiado complicados y propensos a romperse con el posterior uso de Git.

+0

Esto parece no funcionar para mí (aquí los externos son enlaces relativos al mismo repositorio). –

1

Decidí escribir un script de Perl "simple" para manejar todo esto cosas para mí. Lo puse recientemente en github, pruébelo, quizás ayude: http://github.com/sushdm/git_svn_externals/.

Básicamente hace clon git-svn para todos los elementos externos encontrados, y los busca recursivamente, los clona, ​​los vincula simbólicamente en los lugares apropiados y excluye todos los directorios .git_externals y los enlaces simbólicos para que pueda seguir usando 'git svn dcommit'.

Buena suerte.

4

También hice una secuencia de comandos (ambas variantes de Perl y Ruby disponibles) que hace esto por mí, está en http://github.com/liyanage/git-tools/.

  • comprueba de forma recursiva toda svn: externos
  • se puede ejecutar repetidamente en caso de que el clon de un gran repositorio aborta a medio camino. Me sucedió mucho. Empieza donde lo dejó.
  • añade todos svn: externos & entradas que encuentra y procesos para .git/info/excluye
  • añade todos svn: ignore las entradas que encuentra a .git/info/excluye
  • se puede ejecutar regularmente después de la primera carrera de hacer el svn: rebase en todos los sub-sandboxes clonados, descubrir nuevos externos y un nuevo svn: ignora

Actualización: Ya no estoy manteniendo este script. Su funcionalidad para la clonación recursiva y la actualización de un repositorio SVN, así como otras funciones relacionadas con git, está disponible en este proyecto más nuevo que estoy manteniendo activamente: http://liyanage.github.com/git-tools/

+0

Lamentablemente no pude hacer que tus herramientas funcionaran. –

+1

Me gustaría aprender qué no funcionó para ti, así puedo mejorar el guión. ¿Puedes contactarme? –

+0

Hay muchos tenedores. ¿Alguien sabe cuál de ellos funciona en Windows con msysgit? La versión vinculada simplemente se cuelga. – axk

4

Acabo de escribir un pequeño script que verifica todos svn:externals de los actuales HEAD en el directorio raíz y los excluye del repositorio de git.

Colóquelo en .git/hooks/post-checkout y mantendrá esos registros externos actualizados siempre que el árbol de trabajo cambie, por ejemplo debido a git svn rebase o git-checkout.

#!/bin/bash 
set -eu 

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p') 
git svn -r${revision} propget svn:externals | head -n-1 | { 
    while read checkout_args 
    do 
     checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3) 
     svn checkout ${checkout_args} 
     if [ -z $(grep ${checkout_dirname} .git/info/exclude) ] 
     then 
      echo ${checkout_dirname} >> .git/info/exclude 
     fi 
    done 
} 
+1

+1 por algo que casi funciona en Windows git. Tuve que modificarlo un poco, pero es la mejor solución aquí para Windows. – pms1969

+1

@ pms1969: ¿fuente para la versión ajustada? – Carl

1

probar este script en Python https://bitbucket.org/nytmyn/gitsvnext/overview

a svn checkout externos serie siguiendo en su repositorio git

python /../gitsvnext/run update 

plazo esto para saber qué poner a .git/info/excluir

python /../gitsvnext/run list 
+0

¿En qué carpeta ejecutaría esto? Si mi repositorio svn principal es/path/to/repo y los externos están definidos en/path/to/repo/myexternals/folder/¿debería ejecutar el script dentro de/path/to/repo o myexternals/folder? – bibstha

2

Solo para el registro: Seguí this sugerencia y trató de usar SmartGit para tratar con svn:externals.

SmartGit es de lejos el mejor cliente de GUI que he visto para Git. Con respecto a svn:externals, no solo los recupera correctamente, sino que también presenta la opción de realizar una "instantánea rápida" (solo lectura, clon HEAD-only) de repositorios externos.

Desafortunadamente no es gratuito para uso comercial (y el precio de la licencia me pareció un poco demasiado alto, sí, soy un tacaño). Sin embargo, se puede usar de forma gratuita sin fines comerciales.

0

Esto es lo que hice.

Primero creó un vacío repo SVN (por la misma raíz que el GIT):

svn checkout --depth empty http://path/to/repo . 

Esto creó repositorio SVN vacía en la raíz git. El punto es que contiene las propiedades externas de SVN.

Siguiente Simplemente marque sólo lo externo (coloqué en herramientas cygwin PATH):

svn propget svn:externals | sed -e 's//.\//' | sed -e 's/\'//g' | xargs -L1 svn co 
Cuestiones relacionadas