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.