¿Cómo puedo hacer que git am / git aplique trabajo "borroso" como el command de parche

He estado usando git-format-patch y git-am para aplicar cambios de un repository a otro. Las estructuras de los files son las mismas, pero hay algunos cambios en el repository que estoy aplicando, que hacen que la mayoría de los parches fallen unos pocos trozos. Pero la mayoría de los trozos de parche se aplican con un poco de confusión en los numbers de línea.

Por lo que puedo decir, git-am apply una interpretación muy estricta, por lo que rechaza todos estos parches por completo.

Entonces mi flujo de trabajo se ha convertido

 $ git am ../the-patch.patch # Fails because the patch doesn't apply cleanly $ patch -p1 < ../the-patch.patch # Applies most of the hunks, leaves .rej files for the ones that conflict # Fix the conflicting hunks manually $ git am --continue 

Sería bueno si no tuviera que ejecutar el parche de la línea de command y podría simplemente suceder como parte del command am.

Correr con la bandera --reject parece crear un file .rej con todos los trozos en el file si hay algún conflicto, que no es lo que quiero.

Correr con la bandera --3way falla con

 fatal: sha1 information is lacking or useless (the-file.java). Repository lacks necessary blobs to fall back on 3-way merge. Cannot fall back to three-way merge. 

Lo cual supongo es porque el set de cambios en el que se basa no está en el repository al que me estoy fusionando.

¿Hay alguna forma de hacer que git-am apply el parche con concordancia difusa como hace el command de parche sin formatting y solo crear files .rej que contienen los trozos que fallaron?

Si te entiendo correctamente, intentas combinar código de formulario 1 a otro y estás fallando en algunas partes de tu código. A continuación, corrige de forma manual y de ahora en adelante desea que se fusione sin ningún error.

En este caso, debes usar git rerere

En un flujo de trabajo que emplea twigs temáticas relativamente longevas, el desarrollador a veces necesita resolver los mismos conflictos una y otra vez hasta que las twigs del tema se hayan completado (ya sea fusionadas a la twig "release", o enviadas y aceptadas en upstream).

Este command ayuda al desarrollador en este process al registrar los resultados automotrices en conflicto y los correspondientes resultados de resolución de mano en la fusión manual inicial, y aplicando resoluciones de mano grabadas previamente a sus correspondientes resultados automotrices.

 git config --global rerere.enabled true 

Esto tiene las características de una request de function. Para estar seguro de eso, únase a la list de correo de Git (git@vger.kernel.org) y léalo por un time para tener una idea de la cultura. Al mismo time, aclare sus ideas preparando la documentation anterior / posterior tal como se sugirió anteriormente.

Cuando se sienta preparado, preséntese en la list y explíquele su idea de manera consecuente. Asegúrese de abordar la cuestión de si el efecto de su propuesta puede lograrse de manera adecuada por otros medios. Si recibe palabras de aliento, haga un seguimiento con su documentation más detallada. Con los comentarios de su propuesta en la mano, puede decidir enviar un error de request de function, o puede encontrarse en position de crear un parche para su consideración.

Basado en el hilo que enlaza @Nick Desaulniers con el anterior, parece que usar la opción -3 de git apply / am funcionará, al less hasta cierto punto.

Por ejemplo, aquí está mi salida con un parche que falló con git apply :

$ git apply < patch_file.patch error: patch failed: file_being_patched.txt:489 error: file_being_patched.txt: patch does not apply $ git apply -3 < patch_file.patch error: patch failed: file_being_patched.txt:489 Falling back to three-way merge... Applied patch to 'file_being_patched.txt' cleanly.

Es una lástima que aún ofrezca un error (más difícil de analizar la salida en las secuencias de commands), y no dice cuál es el nivel de fuzz del modo en que lo hace, ya que el nivel de fuzz suele ser una buena indicación de si el command de parche podría haberse equivocado.