2010-08-05 21 views
258

¿Cómo puede mi cliente aplicar el parche creado por git diff sin instalar git? He intentado usar el comando patch, pero siempre solicita el nombre del archivo para el parche.¿Cómo aplicar el parche `git diff` sin instalar Git?

+4

¿Alguien sabe cómo hacer esto si el parche incluye cambios de nombre? ¿El parche lo admite de forma nativa ahora? –

+3

La pregunta debería ser: * ¿hay alguna manera * de aplicar un git diff sin instalar git? [Como se indica a continuación] (http://stackoverflow.com/a/17958129/519015), 'patch' no es totalmente compatible con este formato. –

Respuesta

391
git diff > patchfile 

y

patch -p1 < patchfile 

trabajo, pero como muchas personas notan en los comentarios y otras respuestas parche no entiende añade, elimina y cambia el nombre. No hay más opción que git apply patchfile si necesita manejar el archivo agrega, elimina y cambia el nombre.


EDITAR de diciembre de el año 2015

últimas versiones de patch de comandos (2.7, publicado en septiembre de 2012) apoyo mayoría de las características del formato "diff --git", incluyendo cambios de nombre y copias, cambios de permisos y enlaces simbólicos (pero aún no diffs binarios) (release announcement).

Con tal que uno utiliza la versión actual/última de patch no es necesario usar git para poder aplicar su diff como un parche.

+96

O use 'git diff> patchfile', pero' patch -p1

+10

Si desea crear un archivo de parche de un subcampo del repositorio, puede usar la opción 'relative' como:' git diff --no-prefix --relative = my/relative/path> patchfile' –

+0

¿No requiere esto que se instale git? La pregunta es cómo hacerlo sin git ¿verdad? – UpTheCreek

-9

Prueba esto:

$ git apply file.diff 
+25

Ver pregunta: "sin git instalado" –

+1

Gracias, esto también funciona para los usuarios de Windows. – motto

+3

Downvoted, ya que OP dice: "sin git instalado" – scrapcodes

72

probar esto:

patch -p1 < patchfile 
+4

¿Qué hace el argumento -p1? – chrisjlee

+8

Tiras de barra al principio. Ver [man patch] (http://unixhelp.ed.ac.uk/CGI/man-cgi?patch+1) – egor83

+14

@chrisjlee 'git diff' pondrá los prefijos' a/'y' b/'en la salida , por lo que 'patch -p1' descuida aquellos para aplicar el archivo de parche. – wberry

47

Uso

git apply patchfile 

si es posible.

patch -p1 < patchfile 

tiene un posible efecto secundario.

git apply también maneja el archivo agrega, elimina y cambia el nombre si se describen en el formato git diff, que patch no hará. Finalmente, git apply es un modelo de "aplicar todo o abortar todo" en el que se aplica todo o nada, mientras que el parche puede aplicar parcialmente archivos de parche, lo que deja su directorio de trabajo en un estado extraño.

+1

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

+8

Sí, 'git apply' es la mejor manera de hacerlo, pero esta pregunta específicamente pregunta cómo aplicar el parche * sin Git instalado *. –

+0

Opciones '--dry-run --verbose' son útiles para determinar cuáles serán los efectos secundarios, si los hay. (usando el parche v2.5.8) – spyle

5

utilizo

patch -p1 --merge < patchfile 

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