start software control best svn git version-control dvcs

software - ¿Cómo mantengo un svn: external actualizado usando git-svn?



git start (8)

Tratando mi repositorio como un repositorio SVN, obtengo:

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

Al tratarlo como un repo de Git, obtengo:

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

Puedo clonar baz en mi máquina local en otro lugar y agregar un enlace simbólico, pero eso es solo un truco. ¿Hay alguna forma de que git svn rebase automáticamente git svn rebase esos cambios cuando actualiza todo lo demás, como lo hace svn up ?


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

Colóquelo en .git/hooks/post-checkout y mantendrá esos checkouts 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 }


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

Básicamente, hace el clon git-svn para todos los elementos externos encontrados, y los busca de forma recursiva, 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.


Esto es lo que hice.

Primero creé un repositorio de SVN vacío (para la misma raíz que el git):

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

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

A continuación, simplemente verifico solo los externos (los coloqué en las herramientas PATH cygwin):

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


La mejor forma de integrar svn externals con git-svn que he visto es este script , que clona tus externos en un directorio .git_externals / y crea los enlaces simbólicos y excluye los archivos que necesitas. Encuentro esto una solución simple y directa. YMMV.

Aquí hay una descripción más antigua de otras opciones para tratar con svn externos con git-svn. Para mí, se ven un poco demasiado complicados y propensos a romperse con el posterior uso de Git.


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


Solo para el registro: seguí this sugerencia e intenté 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 hacer una "instantánea rápida" (solo lectura, clon HEAD-only) de repositorios externos.

Desafortunadamente no es gratis 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.


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

  • Verifica recursivamente todos los svn: externos
  • Puede ejecutarse repetidamente en caso de que el clon de un repositorio grande aborte a la mitad. Me sucedió mucho. Empieza donde lo dejó.
  • Agrega todas las entradas svn: externals que encuentra y procesa a .git / info / exclude
  • Agrega todas las entradas svn: ignore que encuentra en .git / info / exclude
  • Se puede ejecutar regularmente después de la primera ejecución para hacer el svn: rebase en todos los sub-sandboxes clonados, descubrir nuevos externos y un nuevo svn: ignorar

Actualización: ya no estoy manteniendo este script. Su funcionalidad para clonar y actualizar recursivamente un repositorio SVN, así como otras características relacionadas con git, está disponible en este proyecto más nuevo que estoy manteniendo activamente: http://liyanage.github.com/git-tools/


prueba este script de python https://bitbucket.org/nytmyn/gitsvnext/overview

para realizar el check-out svn externals run following en su repositorio de git

python /../gitsvnext/run update

ejecuta esto para saber qué poner en .git / info / exclude

python /../gitsvnext/run list