Como aplicar um patch a um arquivo (e criar patches) no Linux
O Linux correção
comando permite transferir as alterações de um conjunto de arquivos para outro conjunto de arquivos com rapidez e segurança. Aprenda a usar correção
da maneira mais 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? Isso e onde correção
e diferença
entre no jogo. correção
e diferença
são encontrados no Linux e em outros sistemas operacionais semelhantes ao Unix, como o macOS.
O diferença
comando 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.
Ocorreção
O comando pode ler um arquivo de patch e usar o conteúdo como um conjunto de instruções. Seguindo essas instruções, as alterações no arquivo modificado são replicadas no arquivo original.
Agora imagine esse processo acontecendo com um diretório inteiro de arquivos de texto. Tudo de uma vez. Esse é o poder de correção
.
À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. Vamos orientá-lo neste artigo.
O correção
O comando é 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, independentemente de sua finalidade, código-fonte ou não.
RELACIONADO:Como comparar dois arquivos de texto no terminal Linux
Nosso Cenário de Exemplo
Neste cenário, estamos em um diretório chamado work, que contém dois outros diretórios. Um é chamado trabalhando, e o outro é chamado Mais recentes. 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.
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 diferença
comando encontra as diferenças entre dois arquivos. Sua ação padrão é listar as linhas modificadas na janela do terminal.
Um arquivo é chamado slang.c
. Compararemos a versão do diretório de trabalho com a do diretório mais recente.
O -você
opção (unificada) diz diferença
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 ocorreção
comando localizar precisamente onde uma alteração deve ser feita no arquivo original.
Fornecemos os nomes dos arquivos para que diferença
sabe quais arquivos comparar. O arquivo original é listado primeiro, depois o arquivo modificado. Este é o comando que emitimos para diferença
:
diff -u working / slang.c mais recente / slang.c
diferença
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. Vendo este tipo de saída de diferença
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 diferença
redirecionado para um arquivo chamado slang.patch.
diff -u trabalhando / slang.c mais recente / slang.c> slang.patch
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; no entanto, já que deixa claro que tipo de arquivo é.
Fazercorreção
agir sobre o arquivo de patch e modificar o arquivo de trabalho / slang.c, use o seguinte comando. O -você
opção (unificada) permite correção
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 o -você
opção com correção
.
patch -u working.slang.c -i slang.patch
Se tudo correr bem, há uma única linha de saída informando a você correção
está corrigindo o arquivo.
Fazendo um backup do arquivo original
Podemos instruir correção
para fazer uma cópia de backup dos arquivos corrigidos antes de serem alterados usando o-b
opção (backup). O -eu
A opção (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 por correção
.
Usando diff com diretórios
Podemos usar diferença
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 correção
para que essas diferenças sejam aplicadas aos arquivos na pasta de trabalho com um único comando.
As opções que vamos usar com diferença
são as -você
(contexto unificado) opção que usamos anteriormente, o -r
opção (recursiva) para fazer diferença
procure em quaisquer subdiretórios e o -N
opção (novo arquivo).
O -N
opção diz diferença
como lidar com arquivos no diretório mais recente que não estão no diretório de trabalho. Isso força diferença
colocar instruções no arquivo de patch para quecorreção
cria 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 informamos diferença
para ver arquivos específicos:
diff -ruN trabalhando / mais recente /> slang.patch
Espiando por dentro do arquivo de patch
Vamos dar uma olhada rápida no arquivo de patch. Vamos usar menos
para ver 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, então vamos usar o --funcionamento a seco
opção de verificar se está tudo bem antes de mergulharmos e nos comprometermos a fazer as alterações.
O --funcionamento a seco
opção diz correção
para fazer tudo, exceto modificar os arquivos. correção
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 o --funcionamento a seco
opção e patch com segurança nossos arquivos.
O -d
(diretório) opção dizer correção
em qual diretório trabalhar.
Observe que somos não usando o -eu
(entrada) opção para contar correção
qual arquivo de patch contém as instruções de diferença
. Em vez disso, estamos redirecionando o arquivo de patch para correção
com <
.
patch --dry-run -ruN -d working <slang.patch
De todo o diretório, diferença
encontrou dois arquivos para corrigir. As instruções sobre as modificações para esses dois arquivos foram verificadas por correção
, e nenhum problema foi relatado.
As verificações pré-voo estão OK; estamos prontos para a decolagem.
Patching a Directory
Para aplicar genuinamente os patches aos arquivos, usamos o comando anterior sem o --funcionamento a seco
opção.
patch -ruN -d working <slang.patch
Desta vez, cada linha de saída não começa com "verificação", cada linha começa com "patching".
E nenhum problema é relatado. Podemos compilar nosso código-fonte e usaremos a versão mais recente do software.
Resolva suas diferenças
Esta é de longe a maneira mais fácil e segura de usar correção
. Copie seus arquivos de destino para uma pasta e aplique patch a essa pasta. Copie-os de volta quando estiver feliz que o processo de patch foi concluído sem erros.