¿Cómo aplicar el parche `git diff` sin Git instalado?


280

¿Cómo puede mi cliente aplicar el parche creado por git diffsin git instalado? Intenté usar el patchcomando pero siempre pide el nombre del archivo para parchear.


44
¿Alguien sabe cómo hacer esto si el parche incluye cambios de nombre? ¿El parche admite eso de forma nativa ahora?
Paul Crowley

3
La pregunta realmente debería ser: ¿hay alguna manera de aplicar un git diff sin git instalado? Como se indica a continuación , patchno es totalmente compatible con este formato.
Aryeh Leib Taurog

Respuestas:


425
git diff > patchfile

y

patch -p1 < patchfile

funciona, pero como mucha gente notó en los comentarios y otras respuestas, el parche no comprende las adiciones, eliminaciones y cambios de nombre. No hay opción, pero git apply patchfilesi necesita manejar el archivo agrega, elimina y renombra.


EDITAR Diciembre 2015

Las versiones más recientes del patchcomando (2.7, lanzadas en septiembre de 2012) admiten la mayoría de las características del formato "diff - git", incluyendo cambios de nombre y copias, cambios de permisos y diferencias de enlaces simbólicos (pero aún no diferencias binarias) ( anuncio de lanzamiento ).

Por lo tanto, siempre que se use la versión actual / más reciente de patchno hay necesidad de usar gitpara poder aplicar su diff como un parche.


97
O use git diff > patchfile, peropatch -p1 < patchfile
Jakub Narębski

11
Si desea crear un archivo de parche de una subruta del repositorio, puede usar la relativeopción como:git diff --no-prefix --relative=my/relative/path > patchfile
Koen.

2
patch -p1 < patchfileNo requiere git instalado. El primer comando muestra el comando para generar diff, no aplicarlo.
Andrey Kuznetsov

1
El parche generado es para los cambios desde la rama / especificación de referencia indicada en el comando a la rama actual o activa. En otras palabras, quieres git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfileogit diff from_branch to_branch > patchfile; ...
hobs

1
@PaulChechetin Como dijo egor83 en la respuesta de suppie, al principio elimina la barra.
Andrey Kuznetsov

75

prueba esto:

patch -p1 < patchfile

44
¿Qué hace el argumento -p1?
chrisjlee

8
Las tiras cortan al principio. Ver parche de hombre
egor83

16
@chrisjlee git diffcolocará a/y b/prefijos en la salida, por lo que patch -p1descuida aquellos para aplicar el archivo de parche.
Wberry

49

Utilizar

git apply patchfile

si es posible.

patch -p1 < patchfile 

tiene un posible efecto secundario.

git applytambién se encarga de agregar, eliminar y renombrar archivos si se describen en el git diffformato, lo patchque no funcionará. Finalmente, git applyes un modelo de "aplicar todo o abortar todo" donde se aplica todo o nada, mientras que el parche puede aplicar parcialmente los archivos de parche, dejando su directorio de trabajo en un estado extraño.


1
+1, la única respuesta sensata. Además, diff / patch no manejará enlaces simbólicos, lo cual es un problema si (por ejemplo) está revocando el parche 3.10 del kernel de Linux.
ignis

10
Sí, git applyes la mejor manera de hacerlo, pero esta pregunta específicamente pregunta cómo aplicar el parche sin Git instalado .
Colin D Bennett

1
Las opciones --dry-run --verboseson útiles para determinar cuáles serán los efectos secundarios, si los hay. (usando el parche v2.5.8)
spyle

@ignis - " git apply patchfile -... la única respuesta sensata ..." - eso es casi ridículo. Cada vez que los desarrolladores de OpenSSL me envían un parche para probar, Git no puede aplicarlo. Eso es todo el tiempo. Todavía tengo que ver que esa estúpida herramienta aplique un parche.
jww

8

yo suelo

patch -p1 --merge < patchfile

De esta manera, los conflictos pueden resolverse como de costumbre.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.