git apply falla con el error "el parche no se aplica"
Tengo un parche llamado my_pcc_branch.patch.
Cuando intento aplicarlo, aparece el siguiente mensaje:
$ 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
¿Qué significa?
¿Como puedo solucionar este problema?
git apply --reject --whitespace=fix mychanges.patch
trabajó para mi.
Explicación
La --reject
opción le indicará a git que no falle si no puede determinar cómo aplicar un parche, sino que aplique los fragmentos individuales que puede aplicar y cree archivos rechazados ( .rej
) para los fragmentos que no puede aplicar. Wiggle puede "aplicar [estos] parches rechazados y realizar diferencias por palabras".
Además, --whitespace=fix
advertirá sobre errores de espacios en blanco e intentará solucionarlos, en lugar de negarse a aplicar un fragmento que de otro modo sería aplicable.
Ambas opciones juntas hacen que la aplicación de un parche sea más robusta contra fallas, pero requieren atención adicional con respecto al resultado.
Para obtener la documentación completa, consulte https://git-scm.com/docs/git-apply .
Johannes Sixt de la lista de correo [email protected] sugirió utilizar los siguientes argumentos de línea de comando:
git apply --ignore-space-change --ignore-whitespace mychanges.patch
Esto resolvió mi problema.
Cuando todo lo demás falla, pruebe la opción git apply
de--3way
.
git apply --3way patchFile.patch
--3way
Cuando el parche no se aplica limpiamente, recurre a la combinación de 3 vías si el parche registra la identidad de los blobs a los que se supone que debe aplicarse y tenemos esos blobs disponibles localmente, posiblemente dejando los marcadores de conflicto en los archivos en el árbol de trabajo para que el usuario lo resuelva. Esta opción implica la opción --index y es incompatible con las opciones --reject y --cached.
El caso de error típico aplica la mayor cantidad posible del parche y te deja con conflictos que resolver en git como lo haces normalmente. Probablemente un paso más fácil que la reject
alternativa.
Este comando aplicará el parche y no lo resolverá, dejando archivos defectuosos como *.rej
:
git apply --reject --whitespace=fix mypath.patch
Sólo tienes que resolverlos. Una vez resuelto ejecute:
git -am resolved