Elimine las propiedades innecesarias de svn: mergeinfo

136

Cuando fusiono cosas en mi repositorio, Subversion quiere agregar / cambiar muchas svn:mergeinfopropiedades a los archivos que no tienen ninguna relación con las cosas que quiero fusionar.

Se han hecho preguntas sobre este comportamiento antes aquí en Stack Overflow:

Por lo que entiendo de los temas mencionados anteriormente, parece que muchos archivos en mi repositorio tienen svn:mergeinfopropiedades explícitas sobre 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 manualmente cientos de archivos. ¿Hay una manera más fácil de eliminar esas svn:mergeinfopropiedades innecesarias ?

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

LeonZandman
fuente

Respuestas:

142

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

Desde la raíz del proyecto hacer:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
Vincent
fuente
57
O simplemente no lo haga en el directorio raíz "svn propdel -R svn: mergeinfo ./*"
JeremyWeir
3
"svn propdel -R svn: mergeinfo ./* ./.[^.font>*" si también tiene archivos ocultos "dot" / * ix, probablemente no sea un problema para un usuario de Windows según la pregunta.
Peter
3
suprimir la salida lo acelera: "svn propdel svn: mergeinfo -R> nul" (o> / dev / null usando Linux)
bebbo
2
@JeremyWeir ¿Qué quieres decir con "simplemente no lo hagas en el directorio raíz"? ¿De dónde desde entonces? Tienes muchos votos a favor sobre ese comentario, pero no veo la alternativa.
TT.
3
@TT. Creo que la idea es ir al directorio que tiene toda la información de fusión desordenada y hacerlo desde allí, para que no tenga que revertir el directorio raíz. No desea meterse con la información de fusión de la raíz.
JeremyWeir
15

Aquí hay una manera de eliminar todas las propiedades del subárbol svn: mergeinfo. Ejecútelo dentro de la raíz de su repositorio:

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 obtener una vista previa de los archivos que esto afectará antes de ejecutarlo, cambie el último "propdel" a "propget" o elimine el último tubo de xargs por completo.

Kelvin
fuente
2
Funciona con guiones en archivos: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." El | cortar "-d" -f1 | xargs svn propdel svn: mergeinfo
Squirrel
12

Como se menciona en este hilo :

  • La mayoría de la información de fusión vacía ("en blanco") puede ser causada por copias de trabajo en copias de copia de trabajo / movimientos donde el elemento de origen no tiene información de fusión explícita. 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-a-WC ya no crean mergeinfo vacía en el destino
  • una operación de reestructuración de movimiento de svn anterior (cambio de nombre) también puede propagar mergeinfo, en lugar de dejarlos en el directorio raíz
  • existe un posible problema de memoria, rastreado por el caso 3393 que se solucionará en una próxima versión 1.6.2 y se transferirá en 1.5
VonC
fuente
6

Como no estoy seguro con la svn:merge-infoeliminación ciega de propiedades, 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 controles 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

Yves Martin
fuente
2
Esta herramienta es excelente para consolidar propiedades de información de fusión, como los tipos que se crean con fusiones parciales de subdirectorios que muchos desarrolladores poco coordinados perfectamente en un gran equipo pueden crear. La herramienta parece tener un problema con los archivos que no existen en cada rama, obtengo las propiedades sobrantes de información de fusión en los archivos que indican revisiones en las ramas en las que el archivo nunca existió.
davenpcj
Estoy de acuerdo en que no es perfecto ... es por eso que todavía se requieren "controles y controles humanos". En su caso, si ha identificado revisiones no relevantes en las propiedades merge-info, puede eliminar estas revisiones o toda la propiedad svn: merge-info en esos archivos antes de confirmar. Utilice github para solicitar mejoras.
Yves Martin
4

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 e hice clic en Eliminar en svn: mergeinfo, me preguntó si quiero eliminarlo de forma recursiva. Esto eliminó todos mis svn: mergeinfo cockups.

moribvndvs
fuente
Yo estaba en la misma situación. Trabajó para mi. ¡Gracias!
andrewd18
2

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

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

Obtiene una lista de archivos modificados, la filtra para fusionar solo los cambios de información, elimina todo menos la ruta del archivo real, convierte las rutas de uno por línea en una lista delimitada por espacios y las llamadas vuelven a esa lista.

Chase Seibert
fuente
2
Gracias, pero como habrás sabido de mí al mencionar TortoiseSVN, soy un usuario de Windows y no uso el shell Bash :-)
LeonZandman
Lo mismo debería ser posible en DOS, aunque probablemente no sea tan breve.
Chase Seibert
1
¿Esto no solo revierte archivos con mergeinfo modificado en el directorio de trabajo actual? Si es así, no resuelve el problema: la información de fusión explícita existente. Para eso, necesitarías propdel.
Dominic Scheirlinck
2
Esto es bastante defectuoso: ¿tiene un nombre de archivo con espacios en blanco en su nombre? ¿Con caracteres glob en su nombre? Malas noticias en cualquier caso. La forma aprobada / admitida de analizar la salida del estado de svn es usar el --xmlindicador y un analizador XML; cualquier otra cosa puede cambiar entre versiones, ya que no se garantiza la compatibilidad con el formato de salida de texto.
Charles Duffy
2

En lugar de simplemente borrar ciegamente las propiedades de mergeinfo, también es posible completar las fusiones "faltantes".

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

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

Hacer esto debería terminar eliminando la propiedad mergeinfo para usted, una vez que haya logrado que ambos coincidan exactamente. También es posible que deba hacer lo contrario: fusionar en la raíz cualquier revisión de fusión que solo esté presente en la carpeta secundaria (nuevamente, puede simplemente pegar la lista completa y dejar que SVN resuelva las diferencias por usted).

Miral
fuente
1

Para hacer cambios en una estructura de directorio, esto sería (solo 'buscar' que no sea 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; no es un subdirectorio en el proyecto que necesita su propia SVN: info de fusión, pero tener 121 entradas (incluyendo esos directorios por debajo de 5 ./var con "svn: ignore *") parece algo inadecuado. Por lo tanto, sería bueno tener un script (por ejemplo, Python) que sea capaz de eliminar la información de fusión obviamente superflua y contar sobre otras diferencias ...

Tobias
fuente