2009-08-21 25 views
11

Dado: un repositorio SVN, un directorio bin dentro de él y un script.pl dentro de este bin. Algunas revisiones atrás, bin y script.pl se han agregado al repositorio en una confirmación. Desde entonces, algunas revisiones se han aplicado al script.pl.svn diff para un archivo completo?

Necesario: un comando diff que devolvería un diff completo para script.pl de cero a HEAD, es decir, un diff con todas las líneas agregadas.

Antecedentes: este diff se necesita para la revisión de código, para la alimentación de ReviewBoard

Problema:svn diff con -r X:HEAD (X siendo la primera revisión de script.pl) produce un diff entre la primera versión y cabeza mientras -r X-1:HEAD dime que el archivo script.pl es desconocido en la revisión X-1, que en realidad es correcto. Sin embargo, no puedo encontrar una solución adecuada que incluya el diff de un archivo vacío. Asimismo, no puede diff el directorio bin, ya que se ha añadido en la misma comprometerse como script.pl

Solución:?

+0

Debe ser un solo comando 'svn diff', o puede guiarlo alrededor? – wowest

+0

¿Sería "svn blame" algo que estás buscando? Eso te mostrará cuándo se agregó esa línea exacta al archivo. –

Respuesta

-3

Desde la parte superior de mi cabeza:

svn diff -r X-1:HEAD [email protected] 

El nombre del archivo no es una clave única con el tiempo, pero el nombre de archivo de revisión es @.

+0

Parecía prometedor, pero lamentablemente: svn: No se pudo encontrar la ubicación del repositorio para 'script.pl' en la revisión X-1 –

+0

Sí, lo probé y no funciona. – troelskn

0

Espera, ¿quieres una diferencia entre la versión actual (HEAD) de script.pl y el archivo vacío? No necesita un diff para eso, porque el diff sería simplemente todas las líneas del script.pl actual con las cifras delante de ellas. Emocionante, ¿no?

Si realmente lo necesita en diff forma, ¿por qué no hacer esto?

$ touch EMPTYFILE # creates a new, empty file 
$ diff -u EMPTYFILE script.pl > script.pl.diff 

... o el equivalente local, en caso de que se quede con un sistema menos capaz.

+2

Digámoslo de esta manera: tocar y distinguir es un truco. Hacer esto con Subversion puro fue la intención real de la pregunta, especialmente porque me gustaría utilizar ReviewBoard que hace diffs a sí mismo usando Subversion. Me pregunté por qué Subversion es incapaz de producir un diff apropiado y asumí que soy tonto, pero resulta que es Subversion y no yo el que está un poco sub-presentado :) Pero gracias de todos modos, podría ser capaz de hackear algo juntos . –

+1

Además, otro problema con esto es que las palabras clave de sustitución de SVN (por ejemplo, $ Fecha $, $ Revisión $, $ Id $, etc.) se expandirán en la copia de trabajo, que no desea en una diferencia. "svn diff" no expande estas palabras clave, y ese es el comportamiento que desea. – user102008

0

Me enfrenté al mismo problema y tampoco encontré una solución.

La solución consistía en producir diferencias de un par de revisiones recientes del archivo, luego "Expandir cambios" le muestra el archivo completo y permite hacer comentarios en cualquier lugar.

0

Subversion no hará exactamente lo que usted desea. Lo mejor que puede hacer es un diff del directorio de nivel más bajo que existía cuando se cometió bin/script.pl (presumiblemente, el padre de bin).

6

Sin archivo temporal:

echo "" | diff -u - script.pl

+1

¿por qué no usar '/ dev/null'? con 'diff -u/dev/null script.pl'? – Benoit

+0

Las palabras clave de sustitución de SVN (por ejemplo, $ Fecha $, $ Revisión $, $ Id $, etc.) se expandirán en la copia de trabajo, mientras que "svn diff" no expandirá estas palabras clave, por lo que este no es el mismo – user102008

0

Un poco un truco pero debería hacerlo funcionar ...

Commit todo

for file in find . -name "*.*" | grep -v .svn; do echo "" > $file; done 
svn diff | sed -e 's/^-/+/g' > diffs.txt 

rm -rf ese directorio y svn up de nuevo.

1

Este es el truco que utilizo en esta situación:

cp file1 file2 
svn add file2 
svn diff file2 > file1.diff 
svn rm --force file2 
2

Algunas versiones de SVN parece que le permita hacer svn diff -r 0:HEAD file.txt, pero algunos no lo hacen. Para aquellos que no, utilice lo siguiente:

svn diff --old=/path/to/root/of/[email protected] --new=/path/to/file.txt 

¡Ambos funcionan para cualquier carpeta/archivo/archivo!

Cuestiones relacionadas