2011-12-30 11 views
7

Esta es una pregunta que parece surgir de manera semi-frecuente, pero lamentablemente aún no he encontrado una respuesta que pueda aplicar completamente a mi situación, así que pensé que haría mi propia pregunta . Esta es mi primera pregunta sobre SO, así que se agradable. : PMúltiples repositorios en un directorio

El "problema": Nuestra empresa desarrolla múltiples aplicaciones PHP, sin embargo una de esas aplicaciones es un "maestro" de clases. Todas nuestras otras aplicaciones están instaladas dentro de esta "aplicación maestra" y requieren que la aplicación maestra funcione.

Usamos control de versiones para administrar estas aplicaciones, por supuesto.

Si bien muchos de los archivos en nuestras aplicaciones de complemento están en subdirectorios, no todos son. Esto significa que no podemos usar la importación de subdirectorios (svn externos, submódulos de git, etc.). Por ejemplo, dentro de la carpeta raíz hay varias carpetas (admin, public, kernel, etc.) y las aplicaciones addon tienen archivos dentro de una o más de estas carpetas; no son independientemente independientes dentro de la estructura de directorios de la aplicación maestra. .

Actualmente utilizamos SVN y recientemente nos encontramos considerando git debido a algunas de las funciones disponibles que creemos que podrían ser útiles para nosotros. Sin embargo, una cosa que no entiendo con git es si realmente hay una forma de "fusionar" (no en el sentido de control de la versión) estos repositorios en un solo directorio localmente cuando los desarrolladores están trabajando en el código. No he encontrado una manera de hacer esto con SVN tampoco.

En un mundo ideal, tendríamos un repositorio para nuestra aplicación "maestro" con una estructura de este modo:

  • /
  • --file1
  • --file2
  • -/admin
  • ---- fichero1
  • ---- fichero2
  • -/pública
  • ---- fichero1

Nuestra aplicación complemento tendría una estructura como tal (recuerda, tenemos múltiples aplicaciones de montaje anexo):

  • /
  • --filex
  • -/admin
  • ----/miaplicacion
  • ------ fichero1
  • ------ fi le2
  • -/pública
  • ---- ArchivoX

Hemos experimentado con los siguientes enfoques, cada uno con sus propias advertencias:

  1. Todas las aplicaciones en un único repositorio. Esto es menos que ideal ya que se convierte en una pesadilla manejando versiones para cada aplicación de manera efectiva (especialmente en SVN). La ramificación y el etiquetado llevan archivos de aplicaciones independientes y no relacionadas.
  2. Todas las aplicaciones en un repositorio separado. Esto tampoco es ideal (bueno, es desde una perspectiva de administración/organización) porque no se pueden exportar dos repositorios separados a una única carpeta, por lo que siempre se trabaja con una salida de un repositorio y una exportación de otros. Si está trabajando en la aplicación X y hay cambios en nuestra aplicación maestra, debe realizar manualmente una nueva exportación de esa aplicación maestra y copiar los archivos en el repositorio de la aplicación X en el que está trabajando para tener el último código de estructura.

¿Hay alguna manera con git o SVN (o cualquier otro sistema de control de versiones para el caso) de permitir más de un repositorio dentro de un solo directorio sin usar subdirectorios? SVN Externals es casi perfecto, pero tiene el requisito de que todos los archivos en el repositorio externo estén en una subcarpeta separada, que como se describe arriba no nos funciona. Entiendo que git tiene capacidades equivalentes, pero de nuevo no puede permitir más de un repositorio en una sola carpeta, dejándonos con el mismo problema.

preguntas relacionadas: Multiple repositories in one directory (same level) - is it possible? - esto es muy cercano a lo que estoy pidiendo que pienso, pero no vi ninguna solución que me sentí podría aplicarse a nuestra situación.

+0

con git, que suele hacer que tipo de cosas con ramas. Cada desarrollador puede tener uno o cada submódulo o cualquier combinación que se te ocurra. Cuando sientas que estás listo para fusionar tu rama con la rama maestra (o cualquier otra), lo haces. – Timo

+0

Para ser más preciso : Puede tener una rama para la aplicación maestra y definir las ramas de los módulos en función de eso: heredan la estructura del directorio, pero lo que sea que ponga en ellas permanece allí. La desventaja es que no puede trabajar con múltiples ramas a la vez: necesita todavía los comprueban individualmente, pero todo, de hecho, estará en un directorio y usted puede mover cosas de una rama a otra con bastante facilidad. – Timo

+0

+1 para mudarse a git. O al menos considerándolo. –

Respuesta

2

Subversion 1.6 y 1.7 permiten externos de un solo archivo.

Ver http://svnbook.red-bean.com/en/1.7/svn.advanced.externals.html

"Subversion 1.6 de apoyo también introducido para las definiciones externas para archivos. Archivos externos están configurados como externos para directorios y aparecen como un archivo versionado en la copia de trabajo.

Por ejemplo, supongamos que tiene el archivo/trunk/bikeshed/blue.html en su repositorio, y que querían este archivo, tal como apareció en la revisión 40, que aparecerá en su copia de trabajo de/trunk/www/as green.html."

+0

Esto fue casi perfecto. Excepto por el hecho de que solo puede usar archivos externos SVN dentro del mismo repositorio. Nuestro objetivo era tener un repositorio por aplicación; si vamos a tener todos los archivos en un repositorio, no tendríamos este problema de referencia externa en primer lugar. – bfarber

+0

Ok, finalmente lo que opté por hacer por simplicidad ahora es (1) mover nuestras aplicaciones de complemento a la carpeta de ramas de la aplicación principal (branches/app1/trunk, branches/app2/trunk, etc.). Entonces podemos versionar esas aplicaciones (branches/app1/1_2_x) y podemos usar SVN Externals para extraer los archivos en la carpeta principal de la aplicación ya que ahora están técnicamente en el mismo repositorio. Esto funciona perfectamente – bfarber

+0

¡Me alegra que lo hayas descifrado! Gracias por compartir tu solución final. – lvmisooners

3

que nunca han intentado hacer algo como esto en un entorno de producción, pero que sin duda podría hacer:

 
$ git init 
$ mv .git .git1 
$ git init 
$ mv .git .git2 
$ export GIT_DIR=.git1 
# do work in first repo 
$ export GIT_DIR=.git2 
# do work in second repo 
+0

Lamentablemente, no estar demasiado familiarizado con git esto está un poco por encima de mi comprensión (no es tu culpa). He visto sugerencias similares en línea, y si/cuando nos mudemos a git, volveré a visitar esto. Gracias. – bfarber

+0

Toda la información que git usa para rastrear un repositorio se almacena en un único directorio. Ese directorio se nombra en GIT_DIR. Al cambiar GIT_DIR, cambia los repositorios, manteniendo el mismo directorio de trabajo. –

+0

Creo que entiendo lo que hacen los comandos anteriores. Hemos optado por postergar la prueba de git (el tiempo siempre está trabajando en contra de nosotros, por supuesto), pero lo revisaré en el futuro. ¡Gracias! – bfarber

3

Git le permite especificar el trabajo directorio y git-directorio en el comando de nivel superior git:

git status 

se puede alterar para utilizar una carpeta .git diferente con

git --git-dir=some/other/path/to/a/different/.git/folder status 

Del mismo modo, se puede especificar una carpeta de trabajo diferente:

git --work-tree=some/other/path status 

También se pueden combinar los 2.

Si usted tiene que tener este flujo de trabajo todo el tiempo, puede anular y envuelve el comando git para siempre apunte a un directorio .git específico o dir de trabajo. Un ejemplo es "logros de git" que intercepta los comandos de git y le da recompensas por mejorar con git y luego llama al comando git real: https://github.com/icefox/git-achievements

Parece un problema divertido de resolver.

También me gustaría simplemente tener una rama por aplicación y volver a establecer una base de esas ramas sobre cualquier trabajo que se realice en la aplicación principal. Esta sería realmente mi primera opción.

+0

No estoy demasiado familiarizado con git y cómo se usa en la práctica (en comparación con SVN o CVS, donde las cosas están centralizadas), tendré que leer un poco más sobre cómo este escenario se aborda más comúnmente con git. Veremos la sugerencia de ramificación, gracias. – bfarber

+0

La simplicidad de Git te desconcertará :) estudia la carpeta .git y su estructura. Increíblemente simple después de que lo entiendas. –

+0

Hemos optado, por razones de tiempo, a esperar para probar git. Todo el mundo está familiarizado y configurado con SVN y no a todo el mundo le gusta entrar en el meollo de este tipo de cosas, por lo que es una transición que tendremos que planificar mejor si decidimos seguir esa ruta. Gracias por los consejos: volveré a visitar esto en el futuro si le damos una oportunidad a Git. – bfarber

Cuestiones relacionadas