Ayuda para comprender SVN Externals

Estoy buscando en svn external para mi empresa, y parece que sería una buena característica para nosotros. Tenemos varios productos que a menudo hacen reference a los componentes compartidos, pero tienen la mala costumbre de atrasarse en las versiones anteriores e incluso en las bases de código de diferentes twigs a veces.

He leído un poco decente sobre cómo funcionan ahora, y creo que entiendo bien el concepto. En lo que no estoy 100% seguro es en cómo se unen las diferentes revisiones de múltiples repositorys.

Digamos que tengo un Producto y una Biblioteca. El Producto está construido contra la Biblioteca, por lo que su repository tiene una propiedad svn: externals que enlaza con la fuente de la Biblioteca. En ausencia de una versión específica en la definición svn: externals, cuando reviso HEAD of Product también obtengo HEAD of Library.

Construí varias versiones de Producto a lo largo de los años, cada vez haciendo reference a la última versión de la Biblioteca. Un día, sin embargo, tengo que volver y echar un vistazo a la versión 1 del producto, seleccionando manualmente la revisión correcta. Cuando lo hago, ¿qué versión de Biblioteca obtengo, HEAD o la revisión que utilicé cuando la construí la primera vez?

Espero haber sido un buen desarrollador y haberme acordado labelr todas las versiones de Producto que lanzo. Cuando aplico mi label 'Product-1-0-0' al repository, ¿se label también la revisión correcta del repository de la Biblioteca? Si más tarde reviso el Producto según la label 'Producto-1-0-0', ¿la revisión correcta de la Biblioteca se revisa con ella?

Lo que hay que tener cuidado con svn:externals es que necesita especificar explícitamente la revisión si quiere algo que no sea trunk. Google "pinning svn: externals" para los detalles. Si está utilizando una versión bastante moderna, 1.5 o posterior IIRC, entonces las versiones externas relativas son al less compatibles. Las versiones anteriores, como la que estoy usando en este momento, requieren que -rNNNNN explícitamente la revisión usando la opción -rNNNNN en la propiedad svn:externals para cada maldita carpeta .

Terminamos usando una modificación de una secuencia de commands perl llamada svncopy.pl de tigris.org para hacer todas nuestras ramificaciones y labeldos. No es tan malo, pero desearía haber sabido la cantidad de trabajo que era antes de que decidiéramos usarlos tan fuertemente.

Puede usar los especificadores de date para asegurarse de get las revisiones correspondientes cuando actualice.

Lo hemos hecho por una herramienta que ejecuta PC-Lint; nos gusta ejecutarlo en cada revisión para que podamos diferir los resultados.

Es un poco desagradable en su implementación: nosotros:

  • determinar en qué svnversion está la copy de trabajo (utilizando svnversion )
  • determinar a qué rev la CABEZA está en (usando svn info )
  • tomar las marcas de time para todas las revisiones hasta e incluyendo la cabeza (usando svn log )
  • baje las marcas de time por .999 segundos para estar "seguro" de que obtengamos la revolución (¡yay magia!)
  • actualizar a cada revisión (usando svn update -r {sometimestamp} )
  • ejecuta PC-Lint en la copy de trabajo, diff, mailout, trigger klaxons, lo que sea

(Complejidad digna de Rube Goldberg, ¿no?) Votos ascendentes y gratitud eterna para cualquiera que pueda sugerir una mejor solución.

También podría estar interesado en la sección del libro svn sobre Peg and Operative Revisions , que acabo de descubrir, parece ser una adición relativamente nueva.

Deberías leer sobre los administradores de dependencies. No estoy seguro de cuál es tu plataforma, pero Ivy y Maven resuelven este problema de una manera mucho más limpia.

svn: las versiones externas no están versionadas en subversión. si alguien cambia la revisión o label de uno de tus externos, no tienes forma de saber qué era antes del cambio.

Sí, lo hará, suponiendo que proporcione un número de revisión explícito en sus externos, como se sugiere en los documentos . De lo contrario, utilizará la revisión HEAD de los externos a los que se hace reference.

Solo ten cuidado con el file basado en svn: externals en 1.6. Se ven muy útiles, pero acabo de golpear este error hoy 🙁