Essa é uma boa maneira de criar um patch?

15

Eu gostaria de criar um patch de um gccramo específico comparando-o com os lançamentos oficiais; então, quando eu descompactar o tarball da versão estável, posso aplicar o patch e obter o equivalente ao que estava naquele ramo específico.

É a primeira vez que preciso criar um patch, então é a primeira vez que faço isso e minha principal preocupação é obter as opções e a análise corretas, pois estamos falando de um software extremamente importante

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

Isso é suficiente e a melhor maneira de fazê-lo?

user2485710
fonte
As boas práticas comuns aqui envolvem controle de versão ou alguma variante delas. Isso inclui mercurial, git e suas extensões de fila de correção associadas. Você também pode considerar colcha. Talvez você possa entrar em mais detalhes sobre o que está tentando fazer?
Faheem Mitha 14/10
@FaheemMitha, o que você quer dizer com "mais detalhes"? Eu tenho uma versão do gccstable oficial tar.bz2e outra versão instável a partir de um gitrepositório. Gostaria de criar um patch, é claro que gostaria de comparar apenas com o masterramo, e não com o repositório inteiro.
user2485710
OK, claro, você pode usar algo tão simples quanto diff. mas usar o controle de versão é geralmente preferível. Por um lado, fica muito mais difícil perder a noção do que você está fazendo.
Faheem Mitha 14/10
@FaheemMitha Eu não entendo o que você está sugerindo, o meu tar.bz2claramente não é um gitrepositório, como você acha que devo proceder?
user2485710
1
Faça uma pesquisa para "criando patches usando o controle de versão". Duas respostas anteriores que eu escrevi que estão relacionados são unix.stackexchange.com/a/127810 e unix.stackexchange.com/a/139817
Faheem Mitha

Respostas:

20

Sim, esta é uma boa maneira de criar um patch.

Em resumo:

  1. Para criar um patch para um único arquivo, seu comando pode parecer

    diff -Naru file_original file_updated > file.patch

    Onde

    • -N: tratar arquivos ausentes como vazios
    • -a: tratar todos os arquivos como texto
    • -r: compare recursivamente todos os subdiretórios encontrados
    • -u: gera NUM (padrão 3) linhas de contexto unificado
  2. Para criar um patch para o diretório inteiro:

    diff -crB dir_original dir_updated > dfile.patch

    Onde

    • -c: gera NUM (padrão 3) linhas do contexto copiado
    • -r: compare recursivamente quaisquer subdiretórios
    • -B: ignora as alterações cujas linhas estão todas em branco

Afinal, para aplicar esse patch, é possível executar

patch -p1 --dry-run < dfile.patch

onde switch pinstrui o patch a remover o prefixo do caminho para que os arquivos sejam identificados corretamente. Na maioria dos casos, deveria ser 1.

Remova --dry-runse você estiver satisfeito com o resultado impresso na tela.

jimmij
fonte
pergunta: o que deve acontecer se um diretório ou arquivo for excluído na dir_updatedcomparação com o que havia dir_original? Ele diffcuida disso também ou é pulado?
user2485710
@ user2485710 diff vê quais arquivos foram excluídos. file.patchem apenas um arquivo de texto, para que possa abri-lo em qualquer editor ou apenas catele e você vai ver uma linha comoonly in dir_original: missingfile.txt
jimmij
ok, mas depois patchexcluirá isso missingfile.txtou o que mais?
user2485710
Depende. Se você deseja removê-los, use diff -N ...como no meu primeiro exemplo. Normalmente patch, os arquivos vazios serão removidos por padrão. Se você não quiser, use apenas diff -crBcomo na sua pergunta. Também em alguns casos (raros) é necessária a -Eopção no patchcomando para remover arquivos vazios, após o manual do patch:if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
jimmij
Eu corri diff -Naru dir/file dir/file.new > diff.patchficando can't find file to patch at input line 3com a patch -p0 --dry-run < diff.patchprimeira linha de patch lê a --- dir/filesegunda +++ dir/file.newcom timestamps, o diff parece estar correto, existe alguma opção de como informar os nomes de arquivos exatos que o comando procura?
Ptica 14/03/19