¿Cómo se correlaciona una configuration externa de subversión? ¿Debería uno?

Tenemos un par de aplicaciones de Zend_Framework que nos gustaría mantener en repositorys de subversión separados. Sin embargo, estas aplicaciones comparten la misma capa de abstracción de database y varios de los mismos componentes comunes.

Nos gustaría compartir los bits comunes entre las aplicaciones de alguna manera. La idea actual que tenemos se parece a

svn://foo/itg-common/trunk svn://foo/itg-common/branches/foo svn://foo/itg-common/branches/production svn://foo/itg-app/trunk svn://foo/itg-app/branches/foo svn://foo/itg-app/branches/production 

Ahora, nos gustaría que el repository itg-app tenga una reference externa al repository itg-common. El problema es que queremos, por ejemplo, que itg-app/trunk/common esté vinculado a itg-common/trunk , itg-app/branches/foo/common para vincularlo a itg-common/branches/foo , etc. Esto es, el el patrón general es itg-app/$BRANCH/common -> itg-common/$BRANCH .

Ahora, en principio, podríamos crear estos elementos externos, pero surgen problemas cada vez que intentamos fusionarnos. Por ejemplo, la fusión de $/trunk a $/branches/production sobrescribiría la propiedad svn:externals para hacer que $/branches/production/common apunte a itg-common/trunk .

¿Esto tiene sentido? Si lo hace, ¿hay alguna forma de evitar este problema? Si no es así, ¿por qué no? ¿Qué deberíamos hacer?

¿Esto tiene sentido? Si lo hace, ¿hay alguna forma de evitar este problema? Si no es así, ¿por qué no? ¿Qué deberíamos hacer?

Como prodigitalson ya dijo , un externo en SVN básicamente se considera una pieza de software totalmente diferente, con sus propios ciclos de lanzamiento, twigs, tags, etc. De acuerdo con este model, no debe haber elementos externos no fijados en algún tronco, sino tener todos fijados en una label o una revisión. Ese es un model bastante restringido de usar código de fonts externas, pero eso es lo que SVN admite. Aléjate de esto, y estás solo. (Vea a continuación mi historia personal de guerra sobre eso).

Otra cosa que reconsideraría si fuera usted es referirse a un repository diferente. IME se refiere a un external relativamente al proyecto actual o la raíz del repository es mucho mejor que el uso de routes absolutas. Simplemente considere la posibilidad de que alguna vez pueda cambiar el protocolo de svn: a, digamos, https: (He visto que esto le sucede a una empresa y, a pesar de confiar mucho en las secuencias de commands para cambiar todo lo externo, esta transición fue un desastre del que todos los involucrados siguen teniendo pesadillas). Las routes relativas a las externalidades simplemente son más sólidas, pero solo están disponibles dentro un solo repository.


La compañía para la que trabajo acaba de enfrentar un problema similar. Tenemos muchos códigos compartidos entre diferentes productos. Esto se hace a través de elementos externos, y los proyectos a los que se hace reference externamente tienen elementos externos. En algunos puntos tenemos tres capas de elementos externos recursivos, y ya sabemos que habrá más en el futuro. Todo ese código se trabaja constantemente, y nos gusta dejar que los externos hagan reference al tronco de los proyectos a los que se refieren, porque las testings automáticas lo quitan de encima, y ​​gestionar las versiones de todos esos elementos externos recursivos requeriría esfuerzos que simplemente no podemos permitirnos.

Pero la bifurcación de un proyecto en este context es un verdadero dolor en el cuello , porque no es suficiente para fijar las características externas de un proyecto, cuando esas mismas se refieren a elementos externos no fijados. Siempre que necesite ramificar el proyecto foo a foo' , que, a través de un externo, se refiere al proyecto X , que a su vez, a través de un externo, se refiere al proyecto XX , necesitaría una twig foo' de XX que es una externa en un foo' twig de X , que es un externo de foo' sí mismo. Imagina media docena de elementos externos en foo , la mitad de los cuales tiene sus propios elementos externos, algunos repiten tres o más capas, y llegas al punto en que el proyecto XXX está plagado de twigs creadas para proyectos que ni siquiera debería conocer.

Nuestra solución es recursivamente ya sea A) replace todos los externos por una twig de lo que se refieren o B) configurar una twig de X externa en foo/branches/externals/foo'/X que hace reference <project>/branches/foo' (con foo/branches/externals/foo'/X refiriéndose a foo/branches/externals/foo'/XX ). Sin embargo, establecer esto cuando se crea foo' es increíblemente complejo y ofrece oportunidades más que suficientes para cometer errores tontos, por lo que empleamos guiones para descender de forma recursiva por el proyecto y sus elementos externos, y hacemos todo eso.

Solo debería ser externo a un solo repository en la aplicación. Asumiría que esta sería la twig de "producción" en su repository común. Básicamente se trata el proyecto externo como propio y separado con su propio ciclo de vida de desarrollo.