Como aplico um patch diff no Windows?


136

Existem muitos programas por aí que podem criar um patch diff, mas estou tendo um bom tempo tentando aplicar um. Estou tentando distribuir um patch e recebi uma pergunta de um usuário sobre como aplicá-lo. Então, tentei descobrir por conta própria e descobri que não tenho idéia, e a maioria das ferramentas que posso encontrar são de linha de comando. (Eu posso lidar com uma linha de comando, mas muitas pessoas se perderiam sem uma interface gráfica agradável e amigável. Portanto, essas não são boas para essa finalidade.)

Eu tentei usar o TortoiseSVN. Eu tenho o patch que gostaria de aplicar. Clico com o botão direito do mouse no patch e há uma opção no submenu TortoiseSVN que diz "Apply patch". Tudo o que faz é abrir uma janela vazia.

Então eu tentei abrir o Open. Possui duas opções: mesclar e aplicar diff unificado. (O patch está no formato diff unificado, por sorte.) Mas a opção de aplicar simplesmente não funciona: ele solicita o patch e uma pasta. De alguma forma, ele esqueceu de solicitar o arquivo ao qual aplicar o patch! Portanto, o TortoiseSVN simplesmente não funciona. Existe um utilitário baseado na GUI do Windows que pega um patch e um arquivo e os aplica adequadamente?

EDIT: Olhando para as respostas até agora, parece que o Tortoise só fará o que é certo se for um arquivo que já está com versão. Esse não é o caso aqui. Eu preciso ser capaz de aplicar um patch a um arquivo que não saiu de um repositório SVN. Eu apenas tentei usar o Tortoise, porque sei que o SVN usa diffs e precisa saber como criá-los e aplicá-los.


A resposta do WinMerge parecia boa, mas apenas explica como fazer um patch, não como aplicá-lo. O TortoiseHG tem uma ótima maneira de aplicar patches, mas apenas aos arquivos que estão em um repositório hg, tanto quanto eu sei. Se o SVN externo TortoiseDiff não pode fazer isso, gostaria de saber se alguma ferramenta GUI pode.
Warren P

3
Uau, você está certo, a resposta curta ainda não existe - pelo menos no WinMerge. Solicitação de recurso no WinMerge aqui sourceforge.net/tracker/…
KCD

Respostas:


32

Aplicar patch

Com o TortoiseMerge:

  1. Localize e abra um diretório de repositório SVN existente
  2. Crie um novo diretório chamado "mescla", se ele já não existir
  3. Copie o arquivo no qual deseja aplicar o arquivo .patch
  4. ADD e COMMIT para o repositório svn antes de continuar na próxima etapa
  5. Clique com o botão direito do mouse em mesclagens e escolha Aplicar patch ...
  6. Clique duas vezes no arquivo da lista
  7. O arquivo corrigido com diff é exibido no painel direito
  8. Clique nesse painel e clique em Salvar ou exportar com Arquivo-> Salvar como ...

Screeny alternativo se você abrir no TortoiseMerge. Na tela abaixo, o diretório se refere ao diretório "mesclado" mencionado na etapa 2 acima: Screeny

Captura de tela da GUI do WinMerge: Screeny


@WarrenP: sim, não explica como aplicar o patch usando TortoiseMerge
Walter Stabosz

4
Meu comentário fazia sentido antes das edições e não faz mais sentido depois das edições. Você já está confuso? O registro de data e hora da edição acima (24 de março de 11) parece estar incorreto, pois o OP editou sua resposta novamente desde outubro de 2011. Acho que o registro de data e hora no meu comentário também está errado.
26712 Warren P

9
@SheriffMd Você não recebe o erro "D: \ Pasta não é uma cópia de trabalho"?
onmyway133

1
@SheriffMd Também recebo a mensagem "pasta ... não é uma cópia de trabalho" - então, como é possível usar a fusão de tartaruga para aplicar um patch ao arquivo sem versão?
Peter T.

1
@ onmyway133, reformulei as etapas. Consulte as etapas 2 e 4. Você não receberá a mensagem de erro "Não é uma cópia de trabalho".
Sheriff Md

21

Eu fiz pura ferramenta Python apenas para isso. Possui comportamento previsível entre plataformas. Embora não crie novos arquivos (no momento em que escrevo isso) e não tenha uma GUI, ele pode ser usado como uma biblioteca para criar uma ferramenta gráfica.

ATUALIZAÇÃO : Deve ser mais conveniente usá-lo se você tiver o Python instalado.

pip install patch
python -m patch

1
Eu uso muito isso. Obrigado @techtonik. Alguma novidade sobre como fazê-lo funcionar com o Python3?
Pelson

Execute o patch de instalação do pip com direitos de administração para garantir que funcione.
Vertexwahn

@Vertexwahn é no Linux?
Anatoly techtonik 17/03/19

Python é executado em todos os lugares - Eu testei com o Windows 10
Vertexwahn

Funcionou no Windows 10 quando o patch git não funcionava. Obrigado!
Sqll0

19

O TortoiseMerge é um utilitário separado que acompanha o TortoiseSVN.

Também pode ser baixado separadamente no arquivo TortoiseDiff.zip . Isso permitirá que você aplique diferenças unificadas a arquivos sem versão.


21
AFAIK, isso não pode aplicar o patch em um arquivo sem versão.
pihentagy

Não tive problemas para aplicá-lo a um arquivo sem versão.
Paul Shannon

outros querem: S.
UmNyobe

1
A versão 1.8.7 apresenta um erro sobre o destino não ter sido versionado.
Nick Westgate

15

Eu sei que você disse que preferiria uma GUI, mas as ferramentas da linha de comando farão o trabalho bem. Veja o GnuWin para uma porta de ferramentas unix para o Windows. Você precisaria do comando patch, obviamente ;-)

Você pode encontrar um problema com o término da linha. A porta GnuWin assumirá que o patchfile possui terminação de linha no estilo DOS (CR / LF). Tente abrir o patchfile em um editor razoavelmente inteligente e ele será convertido para você.


Bem colocado. Não seria capaz de descobrir o problema de terminação de linha sem esse comentário.
21711 Bryan

Outra maneira de lidar com as terminações da linha é adicionar a opção "--binary" à linha de comando.
BeReal82

4
Foi isso que me colocou no caminho certo. No entanto, ao executar o Windows 7 ou mais recente, você precisa atualizar o manifesto do patch.exe para evitar a exibição do UAC sempre. Veja esta página para obter instruções: math.nist.gov/oommf/software-patchsets/patch_on_Windows7.html
Anttu

1
Mesmo com as correções do UAC, a versão do patch do GnuWin altera as configurações de segurança dos arquivos. A compilação enviada com o git não sofre nenhum dos dois problemas.
Artfunkel # 7/16

8

No TortoiseSVN, a aplicação de patches funciona. Você precisa aplicar o patch no mesmo diretório em que foi criado . É sempre importante manter isso em mente. Então, aqui está como você faz isso no TortoiseSVN:

Clique com o botão direito do mouse na pasta à qual você deseja aplicar o patch. Ele apresentará uma caixa de diálogo solicitando a localização do arquivo de correção. Selecione o arquivo e isso abrirá uma pequena janela da lista de arquivos que lista os arquivos alterados, e clicar em cada item abrirá uma janela de diferenças que mostra o que o patch está prestes a fazer com esse arquivo.

Boa sorte.


8
Isso não ajuda. Os arquivos de destino não saíram de um arquivo SVN. (Veja a edição para o post original.)
Mason Wheeler

8

O utilitário patch.exe da instalação do Git funciona no Windows 10.

Instale o Git for Windows e use o "C:\Program Files\Git\usr\bin\patch.exe"comando para aplicar um patch.

Se alguma mensagem de erro como a Hunk #1 FAILED at 1 (different line endings).tiver sido exibida na saída durante a aplicação de um patch, tente adicionar a -l(que é um atalho para --ignore-whitespace) ou as --binaryopções à linha de comando.


Esta pergunta é principalmente sobre uma ferramenta da GUI para usuários casuais que não estão familiarizados com as ferramentas de linha de comando típicas. Sua resposta seria mais útil se você pelo menos fornecesse alguns exemplos de comandos completos como exemplo.
Álvaro González

Funciona com o compositor no Windows 10.
ecdani

7

Você pode usar esta porta nativa do Win32 do utilitário de patch.

Ele vem com uma seleção maior de outros utilitários e, ao contrário do Cygwin e similares, ele não precisa de DLLs ou similares. Basta escolher o seu pequeno executável de escolha e armazená-lo onde quiser.

Uso simples:

patch.exe -i <patchfile>

Obtenha mais ajuda:

patch.exe --help

4
Estou tendo problemas com isso no Windows 7: ele abre uma nova janela CMD e solicita privilégios administrativos quando tento executar patch.exe.
Roy Tinker

3
O patch executável também pode ser encontrado no pacote Git for Windows.
precisa saber é o seguinte

6
Se você estiver com problemas ao executar o patch.exe, poderá renomeá-lo para qualquer coisa que não inclua patch. O Windows considera todos os exes com a palavra patchsuspeitos.
wbond 02/02

2

EDIT: Olhando para as respostas até agora, parece que o Tortoise só fará o que é certo se for um arquivo que já está com versão. Esse não é o caso aqui. Eu preciso ser capaz de aplicar um patch a um arquivo que não saiu de um repositório SVN. Eu apenas tentei usar o Tortoise porque sei que o SVN usa diffs e precisa saber como criá-los e aplicá-los.

Você pode instalar o Cygwin e , em seguida, usar a ferramenta de patch da linha de comando para aplicar o patch. Veja também esta página de manual do Unix , que se aplica ao patch .


4
Sim, eu poderia. Eu tenho Cygwin, de fato. Provavelmente eu também poderia fazer sua solução funcionar. Eu não vou colocar meus usuários nisso, no entanto. Você tem idéia de quantos usuários do Windows hoje em dia nem sabem o que é uma linha de comando? : P
Mason Wheeler

2

Parece que o TortoiseSVN (TortoiseMerge) requer a linhaIndex: foobar.py no arquivo diff / patch. Era o que eu precisava fazer para que um arquivo de patch não TortoiseSVN funcionasse com o botão direito do mouse em Aplicar patch do TortoiseSVN comando .

Antes:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

Depois de:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

Ou se você conhece a revisão específica em que seu colaborador estava trabalhando:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)

2

Eu uso o MSYS2 em http://www.msys2.org/

Ele fornece muitas utilidades como patch, which, git,tree , e muitos mais.

Após instalar o MSYS2, basta executar o gerenciador de pacotes para instalar patch:

pacman -S patch

Esta é apenas uma maneira complicada de instalar uma ferramenta de linha de comando. Eu suspeito que você leu apenas o título da pergunta e não a pergunta em si. :)
Álvaro González

1

O patch informa a que arquivo se aplica. O cabeçalho deve ser algo como (veja no Bloco de notas ou no seu editor de texto favorito):

--- Folder/old_file
+++ Folder/new_file

No caso de um patch do Subversion, você também teria números de revisão (já que os nomes dos arquivos são os mesmos).

O patch GNU permitirá que você substitua esses nomes, mas não conheço nenhuma ferramenta GUI para fazer o mesmo. Eu verificaria com os vários programas diff - porém, não parece que o WinMerge suporta a aplicação de patches.


Não, não há nada disso no topo do meu patch. Você está dizendo que o nome do arquivo e o caminho precisam ser incluídos no diff? Quem pensou isso? O que você deve fazer se quiser distribuir um diff a alguém que possa ter coisas instaladas em outras pastas?!?
Mason Wheeler

A parte superior do patch começa assim: --- / +++ / @@ -6,12 +6,12 @@ Sem nomes de arquivos ou qualquer coisa. Como um caminho interno deve funcionar? E se eu criar o patch no XP e alguém tentar usá-lo no Vista (ou vice-versa) e o caminho para a pasta Documentos for diferente?
Mason Wheeler

1
Os nomes dos arquivos são relativos ao diretório raiz do repositório, portanto, as diferenças na estrutura de pastas do XP / Vista não importam. E a razão para ter nomes de arquivos no patch é que a maioria dos patches afeta vários arquivos.
David Z

Entendo. Tá, isso faz mais sentido. Obrigado por esclarecer isso, David!
Mason Wheeler

1

O Eclipse deve ser capaz de fazê-lo, vá para a perspectiva TeamSynchronize e depois em Projeto-> Aplicar patch


1

Para projetos Java, usei o NetBeans para aplicar arquivos de correção. Se o código Java que você está corrigindo ainda não é um projeto do NetBeans, crie um projeto para ele. Para criar um novo projeto:

  • Selecione o menu Arquivo -> Novo projeto
  • Na caixa de diálogo resultante, faça um projeto de aplicativo Java . Dê um nome a ele na caixa de diálogo e clique em Finish.
  • Clique com o botão direito do mouse no nome do seu projeto e selecione Propriedades no menu de contexto
  • Na caixa de diálogo resultante, selecione Origens e adicione um Pasta de Origem . Navegue até sua fonte Java.

Agora que você tem um projeto, aplique o patch:

  • Destaque seu projeto para selecioná-lo
  • No menu principal, selecione o menu Ferramentas -> Aplicar patch diferenciado
  • Na caixa de diálogo resultante, navegue até o arquivo de patch, selecione-o e pressione o botão Patch.

É isso aí. Seu patch deve ser aplicado e você verá uma janela de diferenças mostrando as alterações.



1

Se você estiver usando o Mercurial , isso é feito através de "importação". Portanto, na linha de comando, no hg importcomando ou (você pode encontrar o--no-commit opção útil) ou "Repositório" => "Importar ..." no Hg Workbench.

Observe que eles confirmarão as alterações por padrão; você pode evitar essa hg import --no-commitopção usando a linha de comando ou o Hg Workbench, talvez seja útil emitir hg rollbackapós a mesclagem.


Exatamente o que eu estava procurando! Eu queria saber como evitar o commit.
Keshav

0

Ao aplicar patches usando o TortoiseSVN, normalmente salvo o caminho na raiz do repositório com check-out. Você deve poder clicar com o botão direito do mouse no patch, acessar o menu TortoiseSVN e clicar em ApplyPatch. O ApplyPatch deve descobrir automaticamente em qual nível na hierarquia de diretórios o patch foi criado.

No entanto, tive problemas no passado com a aplicação de patches que contêm novos arquivos ou que envolvem renomeação de arquivos. Qualquer que seja o algoritmo que o Tortoise use para isso não parece lidar muito bem com esses cenários. O Unicode pode fornecer problemas semelhantes.


0

Você tem dois monitores? Eu estava tendo o mesmo problema com o TortoiseMerge e percebi que quando desabilitava um dos monitores, a pequena janela com a lista de arquivos aparecia. Espero que isso ajude você.


0

Se você estiver recebendo a mensagem de erro "Não é uma cópia de trabalho", tente selecionar um diretório na caixa de diálogo TortoiseMerge, que é um diretório de trabalho do SVN.


0

Uma porta BusyBox para Windows possui um comando diff e patch, mas eles oferecem suporte apenas ao formato unificado.


0

Apenas use:

patch -p0 < path-file.patch

lembre-se de executar este comando apenas no local da pasta em que você criou o patch.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.