git cherry-pick con el file de destino renombrado

Tengo dos twigs para diferentes versiones, una para el desarrollo actual y otra para soporte de varios años. Como consecuencia, difieren significativamente. Tengo un file que existe en ambas twigs, pero fue renombrado en desarrollo. Una de las correcciones se realizó originalmente en la twig de desarrollo, pero luego se descubrió que también era necesaria en la twig de soporte. Pero cherry-pick informa que el file no existe en la twig de soporte (porque fue renombrado en desarrollo y en soporte tiene un nombre diferente).

El contenido de este file en particular es similar, por lo que parece que el parche debe aplicarse correctamente, si puedo indicarle a qué file debe aplicarlo. ¿Hay alguna manera (preferiblemente en la command-line) de dirigir manualmente a git para que haga lo que necesito?

El command cherry-pick usa las mismas estrategias de fusión que el command de fusión. La estrategia de combinación recursiva pnetworkingeterminada puede detectar los cambios de nombre en circunstancias normales, pero puede fallar si los files han divergido demasiado como en este caso.

Además de la piratería de índices de bajo nivel descrita en la otra respuesta, podría ser posible hacerlo funcionar simplemente manipulando las opciones de estrategia, por ejemplo, boost el umbral para considerar que un file similar es una versión renombrada (el valor pnetworkingeterminado es 50%) :

git cherry-pick -Xrename-threshold=20% 0123sourcecommithash 

De lo contrario, también podría hacerlo siempre de forma manual, es decir,

 git format-patch 0123sourcecommithash -1 

Luego edite el 0001-Commit-message-here.patch para cambiar la ruta del file y aplicar nuevamente en la twig de destino:

 git am 0001-Commit-message-here.patch 

Retendrá todos los posts de compromiso original, nombres de autor, dates, etc. y podría funcionar como una solución fácil de un solo disparo.

Recordado, donde he visto algo similar. Fue aquí . La secuencia de commands enlazada también ayuda.

Con el script, puede hacerlo con one-liner:

 $ git merge-associate Old/Path/Original.txt :1:New/Path/Renamed.txt :3:New/Path/Renamed.txt 

Lo mismo que si git merge-file compatible :stage:filepath syntax de git show :1:New/Path/Renamed.txt > 1.txt; git show :3:New/Path/Renamed.txt > 3.txt :stage:filepath sin hacer todo el alboroto alnetworkingedor de git show :1:New/Path/Renamed.txt > 1.txt; git show :3:New/Path/Renamed.txt > 3.txt git show :1:New/Path/Renamed.txt > 1.txt; git show :3:New/Path/Renamed.txt > 3.txt descrito en las preguntas frecuentes de Git.