Eu tenho um determinado patch chamado my_pcc_branch.patch.
Quando tento aplicá-lo, recebo a seguinte mensagem:
$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply
O que isso significa?
Como posso resolver este problema?
has type 100644, expected 100755
implica que haja uma incompatibilidade de permissões chmod em algum lugar?Respostas:
git apply --reject --whitespace=fix mychanges.patch
trabalhou para mim.Explicação
A
--reject
opção instruirá o git a não falhar se não puder determinar como aplicar um patch, mas para aplicar blocos individuais, ele poderá aplicar e criar arquivos de rejeição (.rej
) para blocos que não podem ser aplicados. O Wiggle pode "aplicar [esses] patches rejeitados e executar diferenças de palavras".Além disso,
--whitespace=fix
avisará sobre erros de espaço em branco e tentará corrigi-los, em vez de recusar aplicar um pedaço aplicável.As duas opções juntas tornam a aplicação de um patch mais robusta contra falhas, mas requerem atenção adicional em relação ao resultado.
Para toda a documentação, consulte https://git-scm.com/docs/git-apply .
fonte
.rej
arquivos quando não é possível detectar automaticamente como aplicar um patch. Você pode usar o wiggle para resolver esses problemas.Johannes Sixt da lista de discussão [email protected] sugerido usando os seguintes argumentos da linha de comando:
Isso resolveu meu problema.
fonte
-C1
mudar para aplicar, reduz o contexto em torno de adições consideradas importantes.Quando tudo mais falhar, tente
git apply
a--3way
opção .git apply --3way patchFile.patch
O caso típico de falha aplica o máximo possível do patch e deixa você com conflitos para resolver o git, da maneira que normalmente o faz. Provavelmente um passo mais fácil que a
reject
alternativa.fonte
--3way
deve ser o comportamento padrão. Quando o patch falhar, pelo menos me diga o que falhou, para que eu possa corrigi-lo manualmente.git apply
apenas falha e não informa por que algo falha. Eu não conseguia nem encontrar*.rej
arquivos como os quehg
gera.Este comando aplicará o patch que não está resolvendo, deixando arquivos inválidos como
*.rej
:Você apenas tem que resolvê-los. Uma vez resolvido, execute:
fonte
*.rej
- tudo o que posso encontrar é fazer as alterações manualmente no arquivo de origem e excluir esses.rej
arquivos. Qualquer outra maneira ?wiggle --replace path/to/file path/to/file.rej
. Este comando aplicará alterações de.rej
arquivo para arquivo original. Também cria uma cópia do arquivo original, comopath/to/file.porig
. Por favor, a documentação de checkout para obter mais informações sobre a manobraTente usar a solução sugerida aqui: https://www.drupal.org/node/1129120
patch -p1 < example.patch
Isso me ajudou.
fonte
git: 'patch' is not a git command.
emgit version 2.21.1 (Apple Git-122.3)
Isso acontece quando você mistura os clientes git do UNIX e do Windows porque o Windows realmente não tem o conceito do bit "x"; portanto, a verificação de um
rw-r--r--
arquivo (0644) no Windows é "promovida" pela camada POSIX do msys.rwx-r-xr-x
(0755) . O git considera que a diferença de modo é basicamente a mesma que a diferença de texto no arquivo, portanto seu patch não se aplica diretamente. Eu acho que a sua única boa opção aqui é para definircore.filemode
afalse
(usandogit-config
).Aqui está um problema do msysgit com algumas informações relacionadas: http://code.google.com/p/msysgit/issues/detail?id=164 (redirecionado para a cópia de 3 de dezembro de 2013 de archive.org)
fonte
git reset --hard HEAD
forçar o git a fazer check-out novamente de seus arquivos com a nova opção em vigor.No meu caso, eu fui estúpido o suficiente para criar o arquivo de correção incorretamente em primeiro lugar, na verdade diferindo da maneira errada . Acabei com exatamente as mesmas mensagens de erro.
Se você é mestre e faz
git diff branch-name > branch-name.patch
isso, isso tenta remover todas as adições que você deseja que ocorram e vice-versa (que era impossível para o git realizar, pois, obviamente, as adições nunca feitas não podem ser removidas).Portanto, certifique-se de fazer check-out em sua filial e executar
git diff master > branch-name.patch
fonte
AVISO: Este comando pode remover confirmações perdidas antigas PERMANENTEMENTE. Faça uma cópia de todo o seu repositório antes de tentar isso.
Eu encontrei este link
Não tenho idéia do porquê disso funcionar, mas tentei muitas soluções alternativas e esse é o único que funcionou para mim. Em resumo, execute os três comandos abaixo:
fonte
O que eu procurei não está exatamente indicado aqui no SO, estou escrevendo para o benefício de outras pessoas que possam procurar por similares. Eu enfrentei um problema com um arquivo (presente no repositório antigo) sendo removido no repositório. E quando aplico o patch, ele falha, pois não conseguiu encontrar o arquivo a ser aplicado. (então, meu caso é que o patch do git falha para que o arquivo seja removido) '#git apply --reject' definitivamente deu uma visão, mas não me levou à correção. Não pude usar o wiggle, pois não está disponível para nós em nossos servidores de compilação. No meu caso, resolvi esse problema removendo a entrada do 'arquivo que foi removido no repositório' do arquivo de correção que tentei aplicar; portanto, todas as outras alterações foram aplicadas sem problemas (usando a combinação de três vias, evitando erros de espaço em branco) e depois mesclar manualmente o conteúdo do arquivo removido para onde ele foi movido.
fonte
Meu problema é que eu executei
git diff
, executeigit reset --hard HEAD
e percebi que queria desfazer, então tentei copiar a saída degit diff
um arquivo e usá-logit apply
, mas recebi um erro de que "o patch não se aplica". Depois de mudar parapatch
e tentar usá-lo, percebi que um pedaço do diff foi repetido por algum motivo, e após a remoção do duplicado ,patch
(e presumivelmente tambémgit apply
) trabalhou.fonte