Existe alguma maneira de obter um patch criado com git format-patch para ser compatível com svn para que eu possa enviá-lo para um repo svn?
Estou trabalhando em um repo svn no github e desejo enviar minhas alterações de volta ao repo principal. Eu preciso criar um patch para fazer isso, no entanto, o patch não pode ser aplicado, pois o git formata esse patch de forma diferente do svn. Existe algum segredo que ainda não descobri?
ATUALIZAÇÃO: Embora atualmente não exista nenhum script ou maneira nativa do git de fazer isso, consegui encontrar um post do início deste ano sobre como fazer isso manualmente. Eu segui as instruções e tive sucesso em fazer meus patches git funcionarem com o svn.
Se alguém pudesse tentar escrever um script para fazer isso e contribuir com o projeto git, todos ficariam muito agradecidos.
http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308
fonte
Respostas:
Sempre preciso pesquisar isso no Google, mas descobri que funciona perfeitamente (para mim):
git diff --no-prefix master..branch > somefile.diff
, a parte master e branch são opcionais, depende de como você deseja obter seus diffs.patch -p0 < somefile.diff
.Sempre parece funcionar bem para mim e parece ser o método mais simples que encontrei.
fonte
--no-pager
não é mais uma opção paragit diff
.--no-pager
, não tenho certeza por que foi adicionado na edição. Sempre funcionou bem para mim sem nada--no-pager
.git diff --no-prefix 056a1ba5140 7d939289b80 >my.patch
funcionou para mim (onde056a1ba5140
e7d939289b80
são os sha-1 do commit anterior e específico no git).A resposta curta é
patch -p1 -i {patch.file}
.Consulte este blog para obter detalhes: Criando patches do Subversion com git .
fonte
Aqui está um script auxiliar para fazer uma comparação com o último conjunto de alterações svn e o commit fornecido: http://www.mail-archive.com/[email protected]/msg00864.html
fonte
git svn info
assim:REV=`git svn info | grep 'Last Changed Rev:' | sed -E 's/^.*: ([[:digit:]]*)/\1/'`
SVN provavelmente não consegue entender a saída de
git diff -p
, mas você pode recorrer à força bruta:diff -r
os dois clones.fonte
git diff --no-prefix > somefile.diff
em seu repositório git e envie para qualquer usuário svn para que ele aplique o patchpatch -p0 < somefile.diff
na raiz do projeto.O Subversion <1.6 não tem suporte a patch. Parece que o Subversion 1.7 permitirá a aplicação de patches e as extensões git / hg para o diff unificado estão em nossa lista TODO.
fonte
Na verdade, é uma solicitação de recurso do início de 2008
Linus Torvalds disse na época:
Pode ser por isso
foi introduzido no Git1.5.6 em maio / julho de 2008 (ainda não o testei)
fonte
Certifique-se de que suas alterações sejam confirmadas e realocadas em seu branch local do git, a partir do git bash run:
git show --pretty >> myChangesFile.patch
fonte
A resposta aceita fornecida por Nicholas funciona bem, exceto quando a) arquivos binários existem no diff ou b) você está trabalhando no Windows Git e tem diretórios com espaços. Para resolver isso, tive que adicionar um comando git diff aninhado para ignorar os binários e o comando sed para escapar dos espaços. É um pouco complicado de escrever, então criei um alias:
Se você digitar:
... um arquivo de patch Feature123.patch será criado com as diferenças entre a base de mesclagem do branch master e o branch Feature123.
fonte