Como aplicar um patch a um arquivo (e criar patches) no Linux

O comando patch do Linux permite transferir as alterações de um conjunto de arquivos para outro com rapidez e segurança. Aprenda a usar o patch de maneira simples.

Os comandos patch e diff

Imagine que você tenha um arquivo de texto em seu computador. Você recebe uma versão modificada desse arquivo de texto de outra pessoa. Como você transfere rapidamente todas as alterações do arquivo modificado para o arquivo original? É aí que o patch e o diff entram em jogo. patch e diff são encontrados no Linux e em outros sistemas operacionais semelhantes ao Unix, como o macOS.

O comando diff examina duas versões diferentes de um arquivo e lista as diferenças entre eles. As diferenças podem ser armazenadas em um arquivo denominado arquivo de patch.

O comando patch pode ler um arquivo de patch e usar o conteúdo como um conjunto de instruções. Seguindo essas instruções, as mudanças no arquivo modificado são replicado no original Arquivo.

Agora imagine esse processo acontecendo com um diretório inteiro de arquivos de texto. Tudo de uma vez. Esse é o poder do patch.

Às vezes, você não recebe os arquivos modificados. Tudo o que você recebe é o arquivo de patch. Por que enviar dezenas de arquivos quando você pode enviar um arquivo ou postar um arquivo para download fácil?

O que você faz com o arquivo de patch para corrigir seus arquivos? Além de quase ser um trava-língua, essa também é uma boa pergunta. Orientaremos você neste artigo.

O comando patch é mais frequentemente usado por pessoas que trabalham com arquivos de código-fonte de software, mas funciona igualmente bem com qualquer conjunto de arquivos de texto, qualquer que seja sua finalidade, código-fonte ou não.

Nosso Cenário de Exemplo

Neste cenário, estamos em um diretório chamado work, que contém dois outros diretórios. Um é chamado de trabalho e o outro é chamado de mais recente. O diretório de trabalho contém um conjunto de arquivos de código-fonte. O diretório mais recente contém a versão mais recente desses arquivos de código-fonte, alguns dos quais foram modificados.

  Como instalar o Inkscape no Linux

Por segurança, o diretório de trabalho é uma cópia da versão atual dos arquivos de texto. Não é a única cópia deles.

Encontrando as diferenças entre duas versões de um arquivo

O comando diff encontra as diferenças entre dois arquivos. Sua ação padrão é listar as linhas modificadas na janela do terminal.

Um arquivo é denominado slang.c. Compararemos a versão do diretório de trabalho com a do diretório mais recente.

A opção -u (unificado) diz ao diff para também listar algumas das linhas de texto não modificadas de antes e depois de cada uma das seções alteradas. Essas linhas são chamadas de linhas de contexto. Eles ajudam o comando patch a localizar precisamente onde uma alteração deve ser feita no arquivo original.

Fornecemos os nomes dos arquivos para que diff saiba quais arquivos comparar. O arquivo original é listado primeiro, depois o arquivo modificado. Este é o comando que emitimos para diff:

diff -u working/slang.c latest/slang.c

diff produz uma lista de saída mostrando as diferenças entre os arquivos. Se os arquivos fossem idênticos, não haveria nenhuma saída listada. Ver este tipo de saída do diff confirma que há diferenças entre as duas versões do arquivo e que o arquivo original precisa de patch.

Fazendo um arquivo de patch

Para capturar essas diferenças em um arquivo de patch, use o seguinte comando. É o mesmo comando acima, com a saída de diff redirecionada para um arquivo chamado slang.patch.

diff -u working/slang.c latest/slang.c > slang.patch

diff -u working / slang.c latest / slang.c> slang.patch em uma janela de terminal ”largura =” 646 ″ altura = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> O nome do arquivo de patch é arbitrário.  Você pode chamá-lo do que quiser.  Atribuir a ele uma extensão “.patch” é uma boa ideia;  entretanto, uma vez que deixa claro que tipo de arquivo é. </p>
<div style=

Para fazer o patch agir sobre o arquivo de patch e modificar o arquivo de trabalho / slang.c, use o seguinte comando. A opção -u (unificado) permite que o patch saiba que o arquivo de patch contém linhas de contexto unificadas. Em outras palavras, usamos a opção -u com diff, então usamos a opção -u com patch.

patch -u working.slang.c -i slang.patch

Se tudo correr bem, há uma única linha de saída informando que o patch está corrigindo o arquivo.

Fazendo um backup do arquivo original

Podemos instruir o patch a fazer uma cópia de backup dos arquivos corrigidos antes de serem alterados, usando a opção -b (backup). A opção -i (entrada) informa ao patch o nome do arquivo de patch a ser usado:

patch -u -b working.slang.c -i slang.patch

O arquivo é corrigido como antes, sem diferença visível na saída. No entanto, se você olhar para a pasta de trabalho, verá que o arquivo chamado slang.c.orig foi criado. Os carimbos de data e hora dos arquivos mostram que slang.c.orig é o arquivo original e slang.c é um novo arquivo criado pelo patch.

Usando diff com diretórios

Podemos usar diff para criar um arquivo de patch que contém todas as diferenças entre os arquivos em dois diretórios. Podemos então usar esse arquivo de patch com patch para que essas diferenças sejam aplicadas aos arquivos na pasta de trabalho com um único comando.

As opções que vamos usar com diff são a opção -u (contexto unificado) que usamos anteriormente, a opção -r (recursiva) para fazer o diff olhar em qualquer subdiretório e a opção -N (novo arquivo).

A opção -N diz ao diff como lidar com os arquivos no diretório mais recente que não estão no diretório de trabalho. Ele força o diff a colocar instruções no arquivo de patch para que o patch crie arquivos que estão presentes no diretório mais recente, mas ausentes do diretório de trabalho.

Você pode agrupar as opções para que usem um único hífen (-).

Observe que fornecemos apenas os nomes dos diretórios, não estamos dizendo ao diff para examinar arquivos específicos:

diff -ruN working/ latest/ > slang.patch

diff -ruN working / latest /> slang.patch ”width =” 646 ″ height = ”77 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<div style=

Espiando por dentro do arquivo de patch

Vamos dar uma olhada rápida no arquivo de patch. Usaremos menos para examinar seu conteúdo.

A parte superior do arquivo mostra as diferenças entre as duas versões de slang.c.

Percorrendo ainda mais o arquivo de patch, vemos que ele descreve as alterações em outro arquivo chamado structs.h. Isso verifica se o arquivo de patch definitivamente contém as diferenças entre as diferentes versões de vários arquivos.

Olhe antes de pular

Corrigir uma grande coleção de arquivos pode ser um pouco enervante, por isso vamos usar a opção –dry-run para verificar se está tudo bem antes de mergulharmos e nos comprometermos a fazer as alterações.

A opção –dry-run diz ao patch para fazer tudo, exceto modificar os arquivos. patch irá realizar todas as suas verificações pré-voo nos arquivos e se encontrar algum problema, ele os relata. De qualquer forma, nenhum arquivo é modificado.

Se nenhum problema for relatado, podemos repetir o comando sem a opção –dry-run e corrigir nossos arquivos com segurança.

A opção -d (diretório) informa ao patch em qual diretório trabalhar.

Observe que não estamos usando a opção -i (entrada) para informar ao patch qual arquivo de patch contém as instruções do diff. Em vez disso, estamos redirecionando o arquivo de patch para patch com <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

Out of the entire directory, diff found two files to patch. The instructions regarding the modifications for those two files have been checked by patch , and no problems have been reported.

Pre-flight checks are OK; we’re ready for take-off.

Patching a Directory

To genuinely apply the patches to the files we use the previous command without the --dry-run option.

patch -ruN -d working 

This time each line of output doesn’t start with “checking,” each line starts with “patching.”

And no problems are reported. We can compile our source code, and we’ll be on the latest version of the software.

Settle Your Differences

This is by far the easiest and safest way to use patch. Copy your target files to a folder and patch that folder. Copy them back when you’re happy that the patching process completed error free.