O comando patch é a ferramenta inversa do diff. Ele recebe um arquivo, geralmente de extensão .diff ou .patch, e aplica as correções indicadas.
-u
, --unified
) ou context (-c
). Neste documento usaremos o modo unified.
/* * hello.c */ main() { printf("hello!\n"); }Agora o arquivo já modificado, chamado de hello-novo.c
/* * hello.c */ #include <stdlib.h> int main(int argc, char *argv[]) { printf("hello!\n"); return 0; }Após a execução do comando
diff -u hello.c hello-novo.c >hello.patch
, este arquivo irá conter
--- hello.c 2003-11-24 19:10:16.000000000 -0200 +++ hello-novo.c 2003-11-24 19:48:32.000000000 -0200 @@ -2,7 +2,10 @@ * hello.c */ -main() +#include <stdlib.h> + +int main(int argc, char *argv[]) { printf("hello!\n"); + return 0; }Vejamos agora o significado de cada uma dessas linhas
--- hello.c
é o arquivo original;
+++ hello-novo.c
é o arquivo modificado;
@@ -2,7 +2,10 @@
é o contexto da modificação.
-
significa a exclusão de linha;
+
indica a inclusão de linhas;
diff -urN diretório_original diretório_modificadoEssas flags tem o seguinte significado:
-u
unified, como já visto;
-r
recursive, caminha em todos os arquivos e subdiretórios;
-N
New, leva em conta os novos arquivos criandos
$ cd hello $ patch <../hello-novo.patch
$ tar zxvf hello-1.2.3.tar.gz $ cp -r hello-1.2.3 hello-1.2.3.ORIG # mantenho uma cópia original $ cd hello-1.2.3 $ vim hello.c # faço as minhas mudanças $ cd .. $ diff -Nur hello-1.2.3.ORIG hello-1.2.3 >hello-novo.patch
Para aplicar um patch
$ tar zxvf hello-1.2.3.tar.gz # pego uma cópia da versão antiga $ cd hello-1.2.3 $ patch <../hello-novo.patch # ok, versão nova