2008-11-25 21 views
61

El escenario es:¿Cómo hacer que svn diff produzca el archivo que aplicaría el parche, cuando se usaba svn cp o svn mv?

  1. cp SVN o mv algún archivo
  2. modificar ese archivo
  3. svn diff> mypatch

En otra máquina (la misma copia de trabajo, pero no hay cambios):

  1. Intenta aplicar mypatch.
  2. Fail -> intenta modificar el archivo inexistente.

¿Cómo puedo hacer que svn diff produzca el parche con aplicación de parche, o aplicar limpiamente el parche producido por svn diff en este caso? No puedo comprometerme. Me gustaría conservar mergeinfo (porque la solución obvia es agregar el archivo como totalmente nuevo, sin conexión con el anterior).

Respuesta

63

Con subversión, puede especificar qué diff binario usar y los parámetros que se le deben pasar. Ver the manual en svn diff.

Te gustaría producir un archivo de parche normal desde un svn diff, por lo que querrías que el svn diff se viera como un diff normal. Prueba esto:

svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch 
... 
patch -p0 < mypatch 

Prueba de concepto:

echo "newline" >> README.txt 
svn diff --diff-cmd /usr/bin/diff -x "-i -b" > mypatch 
cp README.txt README.txt.patched 
svn revert README.txt 
patch -p0 < mypatch 
diff README.txt README.txt.patched 

No hay diferencia en los dos archivos después de parcheo.

+3

Esto no funciona si hay cambios de propiedad entre ramas. –

+6

Esto no funciona para mí. El archivo de parche que se produce todavía muestra el archivo copiado como una modificación de un archivo original (por ejemplo, tiene líneas que comienzan con, así como líneas que no comienzan con - o +). Además, un intento de parcheo produce: "12 de 14 trozos FALLARON - guardando los rechazos en el archivo". ¿Has probado esto con un archivo de origen que realmente tiene contenido y un archivo de destino que tiene contenido diferente del archivo de origen? –

+1

estaba buscando exactamente lo mismo, y esto funcionó un encanto, gracias – nivanka

0

Sin entender el escenario específico en el que intentas trabajar es difícil identificar por qué querrías hacer esto. Me da la sensación de que estás tratando de hacer cambios controlados en un entorno aislado para evitar impactar a otros usuarios/aplicaciones.

Podría resolver este problema por;

  • Crear una rama para su cambio de código
  • Realice su copia/movimiento y cambios en la rama
  • Obtener la otra parte para cambiar a esta nueva rama de código y continuar compartiendo esta rama

Cuando ambos han estado de acuerdo con los cambios, vuelva a fusionarse en el tronco usando el argumento --reintegrate y rm la rama?

Esto * Mantener merge-info * Identificar la copia/movimiento y los cambios en el control de versiones * Todavía aislar cambios de otros usuarios * impediría cambios incompletas durante el paso 2 siendo un problema, ya que sólo podría añadir más cambios y actualización

5

¿Has probado la opción --show-copies-as-adds mencionada en la página web svn diff y se describe en la página svn options ?.

8

Si desea deshacerse de las propiedades SVN, así como en sus parches, hay una opción para que:

svn diff --patch-compatible > mypatch.diff 

svn help diff dice:

--patch-compatible : generate diff suitable for generic third-party 
         patch tools; currently the same as 
         --show-copies-as-adds --ignore-properties 

parches creados de esta manera se supone para ser compatible con la utilidad antigua normal patch.

+2

Esto se acercó más al resultado esperado que la respuesta con más votos. En realidad, este elimina el contenido del archivo que se movió y agrega las modificaciones correctas para el nuevo archivo. Pero muestra el archivo original como simplemente modificado y no tiene contenido, y el nuevo archivo como un archivo no versionado. Aún así, esta es la mejor respuesta que veo hasta ahora para la pregunta original. – DevDaddyNick

Cuestiones relacionadas