¿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.
¿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.
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.
@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, 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.
patch
no es totalmente compatible con este formato.Respuestas:
y
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 patchfile
si necesita manejar el archivo agrega, elimina y renombra.EDITAR Diciembre 2015
Las versiones más recientes del
patch
comando (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
patch
no hay necesidad de usargit
para poder aplicar su diff como un parche.fuente
git diff > patchfile
, peropatch -p1 < patchfile
relative
opción como:git diff --no-prefix --relative=my/relative/path > patchfile
patch -p1 < patchfile
No requiere git instalado. El primer comando muestra el comando para generar diff, no aplicarlo.git diff from_branch > patchfile; git checkout from_branch; git patch -p1 < patchfile
ogit diff from_branch to_branch > patchfile; ...
prueba esto:
fuente
git diff
colocaráa/
yb/
prefijos en la salida, por lo quepatch -p1
descuida aquellos para aplicar el archivo de parche.Utilizar
si es posible.
tiene un posible efecto secundario.
git apply
también se encarga de agregar, eliminar y renombrar archivos si se describen en elgit diff
formato, lopatch
que no funcionará. Finalmente,git apply
es 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.fuente
git apply
es la mejor manera de hacerlo, pero esta pregunta específicamente pregunta cómo aplicar el parche sin Git instalado .--dry-run --verbose
son útiles para determinar cuáles serán los efectos secundarios, si los hay. (usando el parche v2.5.8)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.yo suelo
De esta manera, los conflictos pueden resolverse como de costumbre.
fuente
Prueba esto:
fuente