2010-11-22 14 views
27

Tengo un script que crea mi aplicación, la carga en una máquina remota, ejecuta una prueba de rendimiento allí y captura algunas métricas que me importan. El script crea un archivo de parche para las modificaciones locales que realizo en mi espacio de trabajo y lo muestra junto con los números de rendimiento. Esto me ayuda a comparar el efecto de varias opciones de ajuste. Si quiero recrear mi espacio de trabajo en una fecha posterior, puedo usar el número de revisión de SVN y el parche.Incluyendo nuevos archivos en SVN diff

svn diff no informa un nuevo archivo que agrego al área de trabajo a menos que explícitamente use svn add en ellos primero. ¿Hay alguna manera de crear un archivo de parche que también incluya los nuevos archivos?

PD: Se formuló una pregunta similar here pero no se respondió adecuadamente, IMO.

+2

¿Cómo es eso un problema? Preparar un parche con SVN es como preparar una confirmación. Ejecutas 'svn status' y' svn diff' para ver si todas las piezas que necesitas están allí y * revert *, * add *, * rm * y editas los archivos hasta que estés satisfecho con tus cambios. –

+0

@Alexandre, quiero una manera _scriptable_ de capturar mis cambios locales de tal forma que pueda volver a crear el estado del área de trabajo más adelante con la información "este delta, aplicada al número de revisión XYZ" o algo similar. –

+0

Es posible que pueda usar 'svn diff --show-copies-as-adds' para hacer lo que quiera, consulte https://stackoverflow.com/a/2185988/131504 –

Respuesta

37

Para hacer que svn diff incluya todos los archivos no versionados de su copia de trabajo local, primero debe agregar estos archivos. svn diff genera el mismo conjunto de cambios que svn commit usaría.

Si está seguro de que se deben agregar todos los archivos no versionados, esto es lo que podría hacer.

Prepare una lista de archivos sin versión mediante la adopción de la salida del svn status todas las líneas que comienzan con un signo de interrogación:

svn status | grep ^? | sed -r 's/^\? +//' > ../unversioned_files_list.txt 

entonces puede pasar que la lista de archivos para svn add usando xargs:

xargs -r -d '\n' svn add < ../unversioned_files_list.txt 

y luego producir el parche:

svn diff > ../my_patch.patch 

Si no desea mantener esos archivos añadidos, utilice la lista de archivos a unadd ellos:

xargs -r -d '\n' svn rm --keep-local < ../unversioned_files_list.txt 
+0

Gracias Alexandre, parece que solo podría trabajo. Lo intentaré y regresaré. –

+1

Alexandre eres un mal culo! – Denis

+0

¡Fantástico! ¡Justo lo que estaba tratando de hacer! ¡Amo la pila! Gracias Alexandre – jtanmay

11

Gracias Alexandre. Al principio, su enfoque no funcionó en mi caso. Estaba seguro de que todos los archivos nuevos estaban marcados A en svn status, sin embargo, el archivo diff todavía estaba vacío. Por último, me encontré con la diferencia de svn status salidas, la cuarta columnas en mi caso están pobladas de +, como:

$ svn st 
M  . 
A + New.java 

Esto significa que el elemento está prevista para addition-with-history [1]. Esto generalmente ocurre cuando svn move o svn copy un archivo o directorio [2]. En mi caso, el New.java es svn merged desde otra rama, incluido el historial de confirmaciones anterior en esa rama. Vamos a eliminar esta información del historial.

primer lugar, encontrar todos los artículos: addition-with-history

svn status | grep ^A | sed -r 's/^A[ +]+//' > /tmp/add_list 

Opcionalmente, eliminar rutas de directorio en /tmp/add_list para evitar advertencias en el siguiente paso.

A continuación, eliminar su historia cometer información por svn remove:

xargs -r -d '\n' svn remove --keep-local --force < /tmp/add_list 

A continuación, volver a la solución de Alexandre para añadirlos a la subversión de nuevo y la diferenciación.

Referencias:

[1]http://svnbook.red-bean.com/nightly/en/svn.ref.svn.c.status.html 
[2]http://www.linuxtopia.org/online_books/programming_tool_guides/version_control_with_subversion/svn.ref.svn.c.status.html 
Cuestiones relacionadas