¿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.

Andrey Kuznetsov
fuente
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.

Andrey Kuznetsov
fuente
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
suppie
fuente
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.

Sola Yang
fuente
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.

denis.peplin
fuente
-16

Prueba esto:

$ git apply file.diff
Shashi
fuente
29
Ver pregunta: "sin git instalado"
CB Bailey