¿Cómo aplico un parche diff en Windows?

136

Existen muchos programas que pueden crear un parche de diferencias, pero estoy pasando un mal rato tratando de aplicar uno. Estoy tratando de distribuir un parche, y un usuario me hizo una pregunta sobre cómo aplicarlo. Así que traté de resolverlo por mi cuenta y descubrí que no tengo idea, y la mayoría de las herramientas que puedo encontrar son de línea de comandos. (Puedo manejar una línea de comando, pero mucha gente se perdería sin una GUI agradable y amigable. Por lo tanto, eso no es bueno para este propósito).

Intenté usar TortoiseSVN. Tengo el parche que me gustaría aplicar. Hago clic derecho en el parche, y hay una opción en el submenú TortoiseSVN que dice "Aplicar parche". Todo lo que hace es abrir una ventana vacía.

Así que intenté golpear Abrir. Tiene dos opciones: fusionar y aplicar diff unificado. (El parche está en formato diff unificado, por suerte.) Pero la opción de aplicar simplemente no funciona: pide el parche y una carpeta. ¡De alguna manera se olvidó de pedir el archivo para aplicar el parche! Entonces TortoiseSVN simplemente no funciona. ¿Existe una utilidad basada en la GUI de Windows que tomará un parche y un archivo y lo aplicará correctamente?

EDITAR: Mirando las respuestas hasta ahora, parece que Tortoise solo lo hará bien si es un archivo que ya está versionado. Ese no es el caso aquí. Necesito poder aplicar un parche a un archivo que no salió de un repositorio SVN. Acabo de intentar usar Tortoise, porque sé que SVN usa diffs y tiene que saber cómo crearlos y aplicarlos.

Mason Wheeler
fuente
La respuesta de WinMerge sonaba bien, pero solo explica cómo hacer un parche, no cómo aplicarlo. TortoiseHG tiene una excelente manera de aplicar parches, pero solo a los archivos que están en un repositorio hg, que yo sepa. Si el SVN externo TortoiseDiff no puede hacerlo, me pregunto si alguna herramienta GUI puede hacerlo.
Warren P
3
Wow, tienes razón, la respuesta corta sigue siendo no, al menos en WinMerge. Solicitud de funciones en WinMerge aquí sourceforge.net/tracker/…
KCD

Respuestas:

32

Aplicar el parche

Con TortoiseMerge:

  1. Encuentre y abra un directorio de repositorio SVN existente
  2. Cree un nuevo directorio llamado "fusiones", si aún no existe
  3. Copie el archivo en el que desea aplicar el archivo .patch
  4. AGREGAR y COMPROMETERSE al repositorio svn antes de continuar con el siguiente paso
  5. Haga clic derecho en fusiones y elija Aplicar parche ...
  6. Haga doble clic en el archivo de la lista.
  7. El archivo parcheado con diff se muestra en el panel derecho
  8. Haga clic en ese panel y presione Guardar o exportar con Archivo-> Guardar como ...

Alternativa de pantalla si se abre desde TortoiseMerge. En la pantalla siguiente, el directorio se refiere al directorio de "fusiones" mencionado en el paso 2 anterior: Screeny

Captura de pantalla de la GUI de WinMerge: Screeny

Sheriff Md
fuente
@WarrenP: sí, explica cómo aplicar el parche usando TortoiseMerge
Walter Stabosz
44
Mi comentario tenía sentido antes de las ediciones, y ya no tiene sentido después de las ediciones. ¿Ya estás confundido? La marca de tiempo de edición anterior (24 de marzo, '11) parece ser incorrecta, ya que el OP ha editado su respuesta nuevamente desde octubre de 2011. Creo que la marca de tiempo en mi comentario también es incorrecta.
Warren P
9
@SheriffMd ¿No recibe el error "D: \ La carpeta no es una copia de trabajo"?
onmyway133
1
@SheriffMd También recibo el mensaje "carpeta ... no es una copia de trabajo", entonces, ¿cómo es posible usar la combinación de tortuga para aplicar un parche a un archivo no versionado?
Peter T.
1
@ onmyway133, he reformulado los pasos. Consulte el Paso 2 y el Paso 4. No recibirá el mensaje de error "no es una copia de trabajo".
Sheriff Md
21

Hice una herramienta Python pura solo por eso. Tiene un comportamiento multiplataforma predecible. Aunque no crea archivos nuevos (al momento de escribir esto) y carece de una GUI, puede usarse como una biblioteca para crear una herramienta gráfica.

ACTUALIZACIÓN : Debería ser más conveniente usarlo si tiene instalado Python.

pip install patch
python -m patch
anatoly techtonik
fuente
1
Yo uso esto mucho. Gracias @techtonik. ¿Alguna noticia sobre cómo hacer que funcione con Python3?
pelson
Ejecute el parche de instalación de pip con derechos de administración para asegurarse de que funciona.
Vertexwahn
@Vertexwahn ¿está en Linux?
anatoly techtonik
Python se ejecuta en todas partes - Lo probé con Windows 10
Vertexwahn
Funcionó en Windows 10 cuando el parche git no funcionaría. ¡Gracias!
sqrl0
19

TortoiseMerge es una utilidad separada que viene incluida con TortoiseSVN.

También se puede descargar por separado en el archivo TortoiseDiff.zip . Esto le permitirá aplicar diferencias unificadas a archivos no versionados.

Paul Shannon
fuente
21
AFAIK esto no puede aplicar parche en un archivo no versionado.
pihentagy
No tuve problemas para aplicarlo a un archivo no versionado.
Paul Shannon
otros quieren: S.
UmNyobe
1
La versión 1.8.7 da un error acerca de que el destino no se está versionando.
Nick Westgate
15

Sé que dijiste que preferirías una GUI, pero las herramientas de línea de comandos harán el trabajo muy bien. Ver GnuWin para un puerto de herramientas de Unix para Windows. Necesitarías el comando parche, obviamente ;-)

Sin embargo, es posible que tenga un problema con la terminación de la línea. El puerto GnuWin asumirá que el patchfile tiene terminación de línea de estilo DOS (CR / LF). Intente abrir el archivo de parche en un editor razonablemente inteligente y lo convertirá por usted.

Sardaukar
fuente
Así poner. No habría podido resolver el problema de terminación de línea sin este comentario.
Bryan
Otra forma de lidiar con los finales de línea es agregar la opción "--binaria" a la línea de comando.
BeReal82
44
Esto fue lo que me llevó por el buen camino. Sin embargo, para ejecutar Windows 7 o una versión más reciente, debe actualizar el manifiesto de patch.exe para evitar tener la ventana emergente UAC cada vez. Consulte esta página para obtener instrucciones
Anttu
1
Incluso con las correcciones de UAC, la versión GnuWin del parche desordena la configuración de seguridad de los archivos. La compilación enviada con git no sufre ninguno de los problemas.
Artfunkel
8

En TortoiseSVN, la aplicación de parches funciona. Debe aplicar el parche al mismo directorio desde el que se creó . Siempre es importante tener esto en cuenta. Así es como lo haces en TortoiseSVN:

Haga clic derecho en la carpeta a la que desea aplicar el parche. Presentará un cuadro de diálogo que le preguntará por la ubicación del archivo de revisión. Seleccione el archivo y esto debería abrir una pequeña ventana de lista de archivos que enumera los archivos modificados, y al hacer clic en cada elemento debería abrir una ventana de diferencia que muestra lo que el parche está a punto de hacer en ese archivo.

Buena suerte.

Dan
fuente
8
Eso no ayuda. Los archivos de destino no salieron de un archivo SVN. (Vea la edición de la publicación original).
Mason Wheeler
8

La utilidad patch.exe de la instalación de Git funciona en Windows 10.

Instale Git para Windows y luego use el "C:\Program Files\Git\usr\bin\patch.exe"comando para aplicar un parche.

Si se Hunk #1 FAILED at 1 (different line endings).recibió un mensaje de error como el de la salida durante la aplicación de un parche, intente agregar el -l(que es un acceso directo para --ignore-whitespace) o los --binaryinterruptores a la línea de comando.

Evgeniy Generalov
fuente
Esta pregunta se trata principalmente de una herramienta GUI para usuarios ocasionales que no están familiarizados con las herramientas típicas de línea de comandos. Su respuesta sería más útil si al menos proporcionara algunos comandos de muestra completos como ejemplo.
Álvaro González
Funciona con el compositor en Windows 10.
ecdani
7

Puede usar este puerto nativo Win32 de la utilidad de parche.

Viene junto con una mayor selección de otras utilidades y en contraste con Cygwin y similares, no necesita ninguna DLL o similar. Simplemente elija su pequeño ejecutable de su elección y guárdelo donde desee.

Uso simple:

patch.exe -i <patchfile>

Obtenga más ayuda:

patch.exe --help
logisch
fuente
44
Tengo problemas con esto en Windows 7: abre una nueva ventana de CMD y solicita privilegios administrativos cuando intento ejecutar patch.exe.
Roy Tinker
3
El ejecutable del parche también se puede encontrar en el paquete Git para Windows.
Snicksie
66
Si tiene problemas al ejecutar patch.exe, puede cambiarle el nombre a cualquier cosa que no incluya patch. Windows considera que todos los ex con la palabra patchson sospechosos.
wbond
2

EDITAR: Mirando las respuestas hasta ahora, parece que Tortoise solo lo hará bien si es un archivo que ya está versionado. Ese no es el caso aquí. Necesito poder aplicar un parche a un archivo que no salió de un repositorio SVN. Acabo de intentar usar Tortoise porque sé que SVN usa diffs y tiene que saber cómo crearlos y aplicarlos.

Puede instalar Cygwin y luego usar la herramienta de parche de línea de comandos para aplicar el parche. Consulte también esta página de manual de Unix , que se aplica al parche .

Brian Clapper
fuente
44
Si, puedo. Tengo a Cygwin, de hecho. Probablemente podría hacer que su solución funcione también. Sin embargo, no voy a poner a mis usuarios a través de eso. ¿Tienes idea de cuántos usuarios de Windows en estos días ni siquiera saben qué es una línea de comando? : P
Mason Wheeler
2

Parece que TortoiseSVN (TortoiseMerge) requiere la líneaIndex: foobar.py en el archivo diff / patch. Esto es lo que necesitaba hacer para que un archivo de parche que no sea TortoiseSVN funcione con el comando Aplicar parche del botón derecho de TortoiseSVN .

Antes de:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

Después:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

O si conoce la revisión específica desde la que trabajaba su colaborador:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)
wilkie mate
fuente
2

Yo uso MSYS2 de http://www.msys2.org/

Proporciona muchas utilidades como patch, which, git, tree, y muchos más.

Después de instalar MSYS2, simplemente ejecute el administrador de paquetes para instalar patch:

pacman -S patch
isapir
fuente
Esta es solo una forma complicada de instalar una herramienta de línea de comandos. Sospecho que solo leyó el título de la pregunta y no la pregunta en sí. :)
Álvaro González
1

El parche le dice a qué archivo aplicar. El encabezado debe ser algo así (verlo en el Bloc de notas o en su editor de texto favorito)

--- Folder/old_file
+++ Folder/new_file

En el caso de un parche de Subversion, también tendrá números de revisión (ya que los nombres de los archivos son los mismos).

El parche GNU te permitirá anular esos nombres, pero no conozco ninguna herramienta GUI para hacer lo mismo. Verificaría con los diversos programas diff, aunque no parece que WinMerge admita la aplicación de parches.

Mark Brackett
fuente
No, no hay nada de eso en la parte superior de mi parche. ¿Está diciendo que el nombre de archivo y la ruta deben incluirse en el propio diff? ¿Quién pensó eso? ¿Qué se supone que debes hacer si quieres distribuir un diff a alguien que tenga cosas instaladas en otras carpetas?
Mason Wheeler
La parte superior del parche comienza así: --- / +++ / @@ -6,12 +6,12 @@ Sin nombres de archivo ni nada. ¿Cómo se supone que funciona una ruta incorporada? ¿Qué sucede si creé el parche en XP y alguien intenta usarlo en Vista (o viceversa) y la ruta a la carpeta Documentos es diferente?
Mason Wheeler
1
Los nombres de los archivos son relativos al directorio raíz del repositorio, por lo que las diferencias en la estructura de carpetas de XP / Vista no importan. Y la razón para tener nombres de archivo en el parche es que la mayoría de los parches afectan a múltiples archivos.
David Z
Veo. OK, eso tiene más sentido. ¡Gracias por aclarar eso, David!
Mason Wheeler
1

Eclipse debería poder hacerlo, vaya a la perspectiva TeamSynchronize y luego a Proyecto-> Aplicar parche

Jose Ospina
fuente
1

Para proyectos Java, he usado NetBeans para aplicar archivos de parche. Si el código Java que está reparando aún no es un proyecto de NetBeans, cree un proyecto para él. Para crear un nuevo proyecto:

  • Seleccione el menú Archivo -> Nuevo proyecto
  • En el cuadro de diálogo resultante, conviértalo en un proyecto de aplicación Java . Déle un nombre en el cuadro de diálogo y haga clic Finish.
  • Haga clic con el botón derecho en el nombre de su proyecto y seleccione Propiedades en el menú contextual.
  • En el cuadro de diálogo resultante, seleccione Orígenes y agregue una Carpeta de origen . Navega hasta tu fuente Java.

Ahora que tiene un proyecto, aplique el parche:

  • Resalta tu proyecto para seleccionarlo
  • Desde el menú principal, seleccione el menú Herramientas -> Aplicar parche diferencial
  • En el cuadro de diálogo resultante, busque su archivo de parche, selecciónelo y presione el botón Parche.

Eso es. Su parche debe aplicarse, y debería ver una ventana de diferencias que muestra los cambios.

user1984699
fuente
1

Ya estoy usando BeyondCompare (comercial) para diferencias y fusiones, y esta herramienta también tiene la capacidad de crear, ver y aplicar parches.

Cuarenta y dos
fuente
1

Si está utilizando Mercurial , esto se hace a través de "importar". Entonces, en la línea de comando, el hg importcomando, o (puede encontrar --no-commitútil la opción), o "Repository" => "Importar ..." en Hg Workbench.

Tenga en cuenta que estos confirmarán los cambios de forma predeterminada; puede evitar esta hg import --no-commitopción de uso si usa la línea de comandos, o si usó Hg Workbench, puede resultarle útil emitir hg rollbackdespués de la fusión.

Marc Gravell
fuente
¡Exactamente lo que estaba buscando! Me preguntaba cómo evitar el compromiso.
Keshav
0

Al aplicar parches usando TortoiseSVN, generalmente guardo la ruta en la raíz del repositorio desprotegido. Entonces debería poder hacer clic derecho en el parche, ir al menú TortoiseSVN y hacer clic en ApplyPatch. ApplyPatch debería determinar automáticamente qué nivel en la jerarquía de directorios se creó el parche.

Sin embargo, he tenido problemas en el pasado con la aplicación de parches que contienen archivos nuevos o que implican renombrar archivos. Cualquier algoritmo que Tortoise use para esto no parece manejar esos escenarios muy bien. Unicode puede darle problemas similares.

tsellon
fuente
0

¿Tienes dos monitores? Estaba teniendo el mismo problema con TortoiseMerge y me di cuenta de que cuando desactivé uno de los monitores, apareció la pequeña ventana con la lista de archivos. Espero que esto te ayude.

Bruno
fuente
0

Si recibe el mensaje de error "No es una copia de trabajo", intente seleccionar un directorio del cuadro de diálogo TortoiseMerge que es un directorio de trabajo de SVN.

Vinod Dalvi
fuente
0

Un puerto BusyBox para Windows tiene un comando diff y patch, pero solo admite el formato unificado.

maullar
fuente
0

Solo usa:

patch -p0 < path-file.patch

recuerde ejecutar este comando solo desde la ubicación de la carpeta donde creó el parche.

Ashish Lohia
fuente