Pregunta

Quiero realizar una actualización de svn a una fecha específica y puedo hacerlo con svn update -r {2010-10-17}.Desafortunadamente, cuando esto encuentra un externo, realizará la actualización dentro del externo sin pasar por el -r {2010-10-17} opción.Esto da como resultado que obtengamos la revisión anterior correcta del código base, pero las versiones más recientes (no deseadas) de muchos de los externos.

¿Cómo puedo actualizar a una revisión o fecha específica y hacer que esto se repita correctamente a través de los externos?

(Nota:Entiendo que el error aquí podría haber sido utilizar elementos externos sin revisiones explícitas especificadas).

¿Fue útil?

Solución

espero, nadie va a poner en práctica mi lógica del sentido común (limitado a lo externo de tipo directorio en algunas áreas) en bash y CMD-script tarde o temprano, y nos pondremos "respuesta definitiva" a esta pregunta se repite

Su tarea es la base:

  • svn up su super-repo a punto necesario en el pasado (actualización hasta la fecha / y sin tiempo / es, por cierto, no es una mejor opción, pero - apllicable)
  • obtener la lista de rutas de acceso a todo lo externo en su proyecto (porque las definiciones externas pueden existir en cualquier lugar en el árbol), desde svn propget svn:externals -R WC-raíz (-R con el fin de comprobar todo el árbol sin mucho cd)
  • para cada cadena de la producción propget (con formato como este . - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib): cd para el último campo de cadena de / con respecto al primer campo, que es, a su vez, es la ruta relativa a la raíz / y SVN hasta el mismo punto , como se hizo para superrepo: svn update -r {2010-10-17}

Como resultado tendrás Mixta copia de trabajo, pero superrepo y personal externo estará en estado "para alguna revisión en el pasado"

Nota:

muestra adicional para la construcción de la ruta local al directorio con las referencias externas (WC anidada en realidad) en el caso más complejo.

En

>svn propget svn:externals -R
tags\1.0.1 - -r 2 https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib@2 lib

trunk - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib

Finales caminos a lo externo en mi WC será (en relación con WC-raíz)

tags\1.0.1\lib
trunk\lib

Otros consejos

Estoy agregando esta respuesta en caso de que alguien esté intentando actualizar un repositorio de subversion ya retirado para sincronizar las fechas del archivo local con las fechas del repositorio, lo cual quería hacer para poder hacer comparaciones de marcas de tiempo de FS.

Hice este oneliner para hacer el truco (pero lee la línea a continuación antes de usarlo):

svn info --show-item last-changed-date -R | xargs -I{} -P1000 -n1 sh -c 'x="{}"; set -x; exec touch -d "${x%% *}" "${x#* }"'

NOTA: El -P1000 especifica que xargs debería correr 1000 copias simultáneas de sh y touch para hacer la actualización real.Dependiendo de la carga del sistema, puede ser conveniente reducirlo.En un pequeño Intel NUC 1000 basado en i3, los procesos resultaron ser perfectos, utilizando entre un 80% y un 95% de CPU (100% generalmente significa que la CPU está sobrecargada).En caso de duda, abra, por ejemplo. htop y pruébelo con diferentes valores, pero ejecútelo solo durante unos segundos, porque deberá ejecutarse desde el principio cada vez.

Para un repositorio SVN pequeño de ~3 GB en un disco duro USB, esto tardó unos 5 minutos en ejecutarse.

El set +x activa la ejecución detallada, lo cual hago justo antes de ejecutar touch para que puedas verlo correr.Si desea una ejecución no detallada, elimine ese comando.

solamente incluyen directorios enteros en otros proyectos:

  • mainprj / bin / subprj1
  • mainprj / bin / subprj2
  • mainprj / dat / subprj1
  • mainprj / dat / subprj2
  • subprj1 / bin # incluido en mainprj / bin / subprj1
  • subprj1 / dat # incluido en mainprj / dat / subprj1
  • subprj2 / bin # incluido en mainprj / bin / subprj2
  • subprj2 / dat # incluido en mainprj / dat / subprj2

con este modelo regresa svn propget svn:externals -R

# cd mainprj
# svn propget svn:externals -R
bin - subprj1 svn+ssh://svnserver/svn/subprj1/trunk/bin
subprj2 svn+ssh://svnserver/svn/subprj2/trunk/bin

dat - subprj1 svn+ssh://svnserver/svn/subprj1/trunk/dat
subprj2 svn+ssh://svnserver/svn/subprj2/trunk/dat

y se puede actualizar a una fecha fija de la siguiente manera:

svn propget svn:externals -R |\ 
   grep -vE '^$' | sed -e "s/^[^-]* - //" |\
   while read line; do \
      pushd ${line##*/}; \
         svn update -r {2019-04-26} ${line%% *}; \
      popd; \
   done

Por lo que he podido averiguar, no se puede hacer esto sin cambiar su configuración externo. Sin embargo, el cambio de la configuración de lo externo cambia para todos, por lo que es sólo una única confirmación y actualización y ya está.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top