Eliminar las propiedades innecesarias de svn: mergeinfo

Cuando fusiono cosas en mi repository, Subversion quiere agregar / cambiar muchas propiedades de svn:mergeinfo a archivos que no están relacionados con las cosas que quiero fusionar.

Las preguntas sobre este comportamiento se han realizado antes en Stack Overflow:

  • Propiedades de SVN Mergeinfo en rutas que no sean la raíz de la copia de trabajo
  • ¿Hay alguna manera de desactivar TortoiseSVN usando svn: mergeinfo off?

Por lo que entiendo de los temas mencionados anteriormente, parece que muchos archivos en mi repository tienen propiedades explícitas de svn:mergeinfo en ellos, cuando no deberían. El consejo es reducir la cantidad y solo poner esas propiedades en archivos / carpetas relevantes.

Así que ahora mi pregunta: ¿cómo puedo eliminar fácilmente esas propiedades innecesarias? Estoy usando TortoiseSVN, pero soy reacio a verificar / corregir cientos de archivos manualmente. ¿Hay alguna manera más fácil de eliminar esas propiedades innecesarias de svn:mergeinfo ?

PD: No estoy buscando el código API C ++ SVN.

Aquí hay otra forma de eliminar todas las propiedades de subdirectorio svn: mergeinfo pero no en la carpeta raíz (esto es necesario para que la bifurcación funcione correctamente).

Desde la raíz del proyecto hazlo:

 svn propdel svn:mergeinfo -R svn revert . svn ci -m "Removed mergeinfo" 

Aquí hay una manera de eliminar todas las propiedades de subtree svn: mergeinfo. Ejecútelo dentro de la raíz de su repository:

 svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo 

Todo en una línea para copiar / pegar fácilmente:

 svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo 

Para previsualizar qué archivos esto tendrá efecto antes de ejecutarlo, cambie el último “propdel” a “propget” o elimine el último conducto de xargs por completo.

Como se menciona en este hilo :

  • La mayoría de las mergeinfo vacías (“en blanco”) pueden ser causadas por la copia de trabajo para copias de trabajo / movimientos donde el elemento de origen no tiene mergeinfo explícito. El uso de propdel puede ser la solución a menos que esté utilizando un SVN 1.6: desde 1.5.5 estas copias WC-to-WC ya no crean mergeinfo vacío en el destino
  • una operación de reestructuración de svn move (rename) anterior también puede propagar mergeinfo, en lugar de dejarlos en el directorio raíz
  • existe un posible problema de memoria, seguido por el caso 3393, que se solucionará en una próxima versión 1.6.2 y se retrotraerá en 1.5

Como no estoy seguro con la eliminación de propiedad de svn:merge-info , he implementado una herramienta para analizar la situación actual en una copia de trabajo y eliminar tantas revisiones de fusión como sea posible de las propiedades de información de fusión no raíz. Después de verificaciones y controles humanos adicionales, se pueden confirmar los cambios en la copia de trabajo.

Aquí está: svn-clean-mergeinfo

No dude en informar cualquier problema sobre su uso para mejorarlo.

Subversion 1.10 presenta una nueva herramienta dedicada a esa tarea: svn-mergeinfo-normalizer

Sé que ha pasado un tiempo, pero me encontré con un problema similar. Estoy usando TortoiseSVN 1.6.7. Dio la casualidad de que la propiedad estaba en la raíz de mi copia de trabajo. Cuando vi las propiedades en la raíz y hice clic en Eliminar en svn: mergeinfo, me preguntó si quería eliminarlo recursivamente. Esto eliminó todos mis cockups svn: mergeinfo.

Si está seguro de que desea eliminar en masa las propiedades de mergeinfo, puede usar el siguiente script de BASH.

 FILES=`svn status |grep "^ M " |sed s/" M "// |tr '\n', ' '` svn revert $FILES 

Obtiene una lista de archivos modificados, la filtra solo mergeinfo solo cambia, elimina todo menos la ruta real del archivo, convierte las rutas de una línea en una lista delimitada por espacios, y las llamadas revierten en esa lista.

En lugar de simplemente borrar a ciegas las propiedades de mergeinfo, también es posible completar las fusiones “perdidas”.

Copie la propiedad mergeinfo de la carpeta raíz y luego realice una fusión en la carpeta secundaria para la ruta relativa adecuada y la misma lista de revisión. (Puede, pero no necesita, solo enumerar las diferencias entre esta lista y la que ya está en la carpeta secundaria).

Normalmente esta combinación debería terminar cambiando solo las propiedades de mergeinfo, no los archivos reales. (Si termina cambiando los archivos, entonces una de las combinaciones anteriores debe haber sido solo una combinación parcial, lo que puede haber estado causando problemas de todos modos).

Hacer esto debería terminar borrando la propiedad mergeinfo por ti, una vez que hayas conseguido que ambos coincidan exactamente. Es posible que también deba hacer lo contrario: fusione en la raíz las revisiones de fusión presentes solamente en la carpeta secundaria (nuevamente, puede simplemente pegar la lista completa y dejar que SVN resuelva las diferencias para usted).

Para hacer cambios en una estructura de directorio, esto sería (no ‘solo’ de DOS):

 find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \; 

Al ejecutar un cliente 1.6.12 conectado a un servidor 1.5, tengo un problema similar; hay un subdirectorio en el proyecto que necesita su propia svn: mergeinfo, pero tener 121 de tales entradas (incluyendo 5 directorios debajo de ./var con “svn: ignorar *”) parece algo inapropiado. Por lo tanto, sería bueno tener una secuencia de comandos (por ejemplo, Python) que es capaz de eliminar la información de fusión obviamente superfluo y contar sobre otras diferencias …