Estoy desarrollando un proyecto en Git. TI depende de otro proyecto, que está en un repositorio de Subversion. Me gustaría poder realizar cambios en el proyecto Subversion en el árbol y comprometerme / actualizar desde el repositorio Subversion desde el proyecto Git. ¿Es eso posible?
8
Respuestas:
No puedo ser el único en pensar en el meme de elementos anidados de Xzibit , ¿verdad? De todas formas...
Una de las cosas interesantes que hace Subversion se llama "externos". Es una forma de apuntar a una rama o directorio específico en otro repositorio svn. Incluso puede fijarlo a una versión específica de un directorio específico. Los externos son realmente ingeniosos y resolverían este problema en un instante, ya que los cambios realizados en un directorio externo se envían automáticamente al origen cuando se realiza una confirmación.
Externals también es algo que falta en git. Git tiene submódulos , pero no funcionan de la misma manera, ya que están vinculados a un compromiso específico. Esto significa que no existe una solución nativa para el problema de tener repositorios "anidados" que puedan leerse y escribirse al mismo tiempo y permanecer perfectamente sincronizados, y no menos repositorios anidados utilizando diferentes backends.
Si no desea hacer la revisión de submódulo fijando danza , hay otra solución alternativa.
Git tiene una emulación svn decente en la
git-svn
herramienta. Probablemente ya lo estés usando. La pregunta SO "¿Cómo mantengo un svn: externo actualizado usando git-svn?" nos ofrece una opción útil al abusar de esa herramienta.La respuesta aceptada fue simplemente usar
git-svn
para verificar el repositorio de Subversion fuera del árbol controlado por git , simplemente usando un enlace simbólico para señalarlo dentro del árbol. Hay un poco más de trabajo manual involucrado en este, ya que deberá recordar confirmar ese repositorio específico cada vez que realice un cambio en él. Sin embargo, es simple, es sencillo y se sabe que funciona.Otra opción del todo estaría mirando de Mercurial subrepositories , que pueden acoger tanto Git y SVN. No estoy seguro si realmente quieres llegar a tres niveles de profundidad.
fuente
checkout
en el árbol de Git y excluir la copia de trabajo SVN del repositorio de Git por completo.gitignore
.git-svn
porque no los manejaAunque desanimado por Charles , creo que realmente estás buscando submódulos git :
Si bien Charles parece pensar que los
git
submódulos son deficientes porque no pueden funcionar comosvn
externos (haciendo referencia a la cabeza de una rama en lugar de una revisión específica), creo que esto se debe a la diferencia en el flujo de trabajo esperado entregit
ysvn
como cualquier otra cosa.Dependiendo de cuándo y dónde haya actualizado su copia de trabajo, los directorios en diferentes puntos de su
svn
jerarquía de directorios de trabajo pueden estar en diferentes revisiones. Eso no es posible congit
. Cadagit
vez que actualiza a una revisión, actualiza la totalidad de su copia de trabajo a esa revisión; espera que cuando vaya a la revisión 123abc obtenga exactamente el mismo código que la última vez que revisó 123abc, y eso incluye cualquier y todos los submódulos que esa revisión pueda tener.Si desea actualizar un submódulo , debe actualizarlo y luego realizar una nueva confirmación al supermódulo para actualizarlo y usar la nueva revisión en el submódulo . Significa que los submódulos son menos flexibles que los externos , pero refuerza el
git
paradigma primario de una instantánea amplia del repositorio.Si desea que los
svn
externos siempre usen la última funcionalidad de revisión , entonces está bastante solo. Como se mencionó, solo tiene que revisar elsvn
submódulo manualmente y luego.gitignore
.svn
funciona, la forma en que funcionan los externos es perfectamente aceptable.git
funciona, la forma en que funcionan los submódulos es perfectamente aceptable.Por cierto, hasta donde yo entiendo, los subrepositorios de Mercurial funcionan de la misma manera que los submódulos de Git , por lo que eso tampoco ayudará.
fuente
¿Solo estás buscando
git-svn
? Por depende, ¿quiere decir que la versión principal está en svn o tiene proveedores que son proyectos svn?Asumir por depende significa la dependencia:
Puede poner cualquier tipo de repositorio dentro de un repositorio git sin problemas. p.ej
etc.
Y luego maneja
svnproject
como lo harías normalmente. Por supuesto, puede usarlogit-svn
para interactuar con su repositorio svn usando los comandos git.También puedes hacer esto:
En ese caso, las actualizaciones que realice en los archivos
svnproject
aparecerán como svn y git diffs. Un ejemplo donde/tmp/gitproject
es un proyecto .. git, y/tmp/gitproject/vendor/minify
es un pago (aleatorio) svn:Si usa
git-svn
para interactuar con su repositorio dependiente de svn, es posible mantenerlo sincronizado con los cambios que ha realizado en el proyecto git principal utilizandogit-filter-branch
y, por lo tanto, no es necesario comprometerse con cada repositorio individualmente.Como un aparte: por experiencia, mantener un proyecto git y svn sincronizado es generalmente bastante problemático a menos que uno u otro sea de solo lectura.
fuente
Git tiene un contenedor svn. Aquí hay un resumen rápido: Uso efectivo de Git con Subversion
fuente