¿Cómo utilizar el repositorio de Subversion dentro del repositorio de Git?

8

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?

Jonás
fuente
A la luz de sus comentarios a continuación, su pregunta es / fue "¿puedo hacer un pago de svn dentro de un repositorio de git?" - Y la respuesta simple es: sí. La respuesta que has aceptado no responde a esta pregunta.
AD7six

Respuestas:

13

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-svnherramienta. 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-svnpara 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.

Charles
fuente
1
Comprueba si has respondido la pregunta, +1 para el yo dawg :)
Jonás
Bueno. La solución que he decidido es simplemente checkouten el árbol de Git y excluir la copia de trabajo SVN del repositorio de Git por completo .gitignore.
Jonás
Dejando a un lado los resúmenes de edición sarcásticos, la reputación está ahí para fomentar el buen comportamiento y hacer del sitio un lugar mejor para todos, los comentarios están ahí para resaltar dónde se pueden hacer mejoras. Creo que con sus ediciones su pregunta es mucho más útil, de ahí la reversión de una selección no útil a una útil . Si no pensara que su respuesta se beneficiaría de mis comentarios, no los habría hecho. Si fueran ofensivos para , habría marcado. Tal como están las cosas, creo que todos nos beneficiamos de que se mejoren las buenas respuestas. (Este comentario se autodestruirá en ...)
Mark Booth
Hola, te escuché como svn, así que puse svn en tu git, para que puedas svn mientras git ...
Dave Arkell
El problema es que si su repositorio svn contiene elementos externos, puede olvidarse de usarlos git-svnporque no los maneja
Daniel Alder
3

Aunque desanimado por Charles , creo que realmente estás buscando submódulos git :

El soporte de submódulos de Git permite que un repositorio contenga, como subdirectorio, un pago de un proyecto externo. Los submódulos mantienen su propia identidad; el soporte de submódulos solo almacena la ubicación del repositorio de submódulos y la ID de confirmación, de modo que otros desarrolladores que clonan el proyecto que contiene ("superproyecto") pueden clonar fácilmente todos los submódulos en la misma revisión. Son posibles los pagos parciales del superproyecto: puede decirle a Git que clone ninguno, algunos o todos los submódulos.

Si bien Charles parece pensar que los git submódulos son deficientes porque no pueden funcionar como svn 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 entre gity svncomo cualquier otra cosa.

Dependiendo de cuándo y dónde haya actualizado su copia de trabajo, los directorios en diferentes puntos de su svnjerarquía de directorios de trabajo pueden estar en diferentes revisiones. Eso no es posible con git. Cada gitvez 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 gitparadigma 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 el svn submódulo manualmente y luego .gitignore.

  • Dada la forma en que svnfunciona, la forma en que funcionan los externos es perfectamente aceptable.
  • Dada la forma en que gitfunciona, 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á.

Mark Booth
fuente
2

¿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

$ mkdir ~/project
$ cd ~/project
$ git init
$ ...
$ git commit -va
[master (root-commit) xxxxxxx] Did something
 ...
$ mkdir vendors
$ cd vendors
$ svn checkout svnproject(url)
$ cd svnproject
$ ...
$ svn ci -m "committing to svnproject"

etc.

Y luego maneja svnprojectcomo lo harías normalmente. Por supuesto, puede usarlo git-svnpara interactuar con su repositorio svn usando los comandos git.

También puedes hacer esto:

$ cd ~/projects
$ git add vendors/svnproject
$ git commit -m "adding svnproject source to main repo"

En ese caso, las actualizaciones que realice en los archivos svnprojectaparecerán como svn y git diffs. Un ejemplo donde /tmp/gitprojectes un proyecto .. git, y /tmp/gitproject/vendor/minifyes un pago (aleatorio) svn:

[andy@laptop:/tmp/gitproject/vendor/minify]$ vim README.txt 
[andy@laptop:/tmp/gitproject/vendor/minify]$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working     directory)
#
#   modified:   README.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[andy@laptop:/tmp/so/vendor/minify]$ svn status
M       README.txt
[andy@laptop:/tmp/so/vendor/minify]$

Si usa git-svnpara interactuar con su repositorio dependiente de svn, es posible mantenerlo sincronizado con los cambios que ha realizado en el proyecto git principal utilizando git-filter-branchy, 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.

AD7six
fuente
Creo que no quiero que Git rastree la copia de trabajo SVN, porque eso sería redundante.
Jonás
No lo hará, a menos que los agregue explícitamente al git repo jonah
AD7six
1

Git tiene un contenedor svn. Aquí hay un resumen rápido: Uso efectivo de Git con Subversion

Al igual que muchas organizaciones que usan Rails, hemos captado la ola git y estamos en un estado de transición entre git y Subversion. Nuestro trabajo de código abierto se almacena en repositorios git, pero nuestro trabajo de cliente todavía se almacena en repositorios de Subversion, y probablemente lo será por algún tiempo. Si bien git es sorprendente, Subversion todavía tiene sus buenas cualidades y es un excelente repositorio centralizado, especialmente con su ecosistema de herramientas fáciles de usar.

La integración entre git y Subversion (git-svn) está tan bien hecha que varios de nosotros hemos estado usando git como nuestra interfaz para todos nuestros repositorios de Subversion. Hacer esto es bastante simple, pero hay algunos trucos interesantes, por lo que pensé en compartir un día en la vida de Viget con git-svn ...

Craige
fuente
1
Encontré ese enlace antes, pero parece ser sobre el uso de Git para administrar una copia de trabajo de Subversion. Quiero poner la copia de trabajo de Subversion dentro de un repositorio de Git.
Jonás
¿te importaría explicar más sobre lo que hace y para qué sirve? Las "respuestas de solo enlace" no son del todo bienvenidas en Stack Exchange
mosquito