git-subtree no encuentra la última calabaza

Con este repository , git subtree merge --squash --prefix=resources/webidl2 8a7ff70664 donde ese commit proviene de este repository , falla con un conflicto de fusión.

Añadiendo -d para habilitar la salida de debugging, descubrimos:

 Squash found: 5353ef707674e9d894f207581d7dffab2609b832 bd216bcd5596d60734450adc938155deab1e1a80 

Sin embargo, esta no es la última --grep squash, y ejecutando manualmente la llamada de logging y cambiando la opción --grep se vuelve evidente que --grep="^git-subtree-dir: resources/webidl2/*\$" no es haciendo coincidir 960a3d21bab0293630da8919847f87f4af3a3198 sin razón aparente (no coincide con --grep="^git-subtree-dir: resources/webidl2/*" , pero las líneas que contienen git-subtree-dir en ambos confirma que coinciden con byte por byte idéntico, por lo tanto, no tiene sentido por qué uno se corresponde con la opción anterior --grep , pero no el otro).

Dado que git-subtree no está logrando encontrar esta calabaza anterior, ¿cómo puedo hacer una nueva calabaza sin que piense que todo es un cambio local y, por lo tanto, termina con conflictos?

Mirando el object de la confirmación que no se encuentra:

 $ git cat-file -p 960a3d21bab0293630da8919847f87f4af3a3198 | hexdump -C […] 00000cc0 6c 6c 6f 77 20 60 2d 60 0d 0a 0d 0a 67 69 74 2d |llow `-`....git-| 00000cd0 73 75 62 74 72 65 65 2d 64 69 72 3a 20 72 65 73 |subtree-dir: res| 00000ce0 6f 75 72 63 65 73 2f 77 65 62 69 64 6c 32 0d 0a |ources/webidl2..| 00000cf0 67 69 74 2d 73 75 62 74 72 65 65 2d 73 70 6c 69 |git-subtree-spli| 00000d00 74 3a 20 38 38 63 35 63 35 62 36 62 62 36 37 35 |t: 88c5c5b6bb675| 00000d10 64 30 64 39 35 61 65 33 65 63 34 64 62 33 32 35 |d0d95ae3ec4db325| 00000d20 38 37 36 38 64 30 63 38 66 63 30 |8768d0c8fc0| 00000d2b 

El punto vital aquí es que la línea git-subtree-dir finaliza con 0d 0a (CR LF). git log --grep – la operación $ git log --grep coincide con el final de línea, que como era de esperar en un sistema que no es de Windows es LF, y por lo tanto ^git-subtree-dir: resources/webidl2/*\$ doesn ' t partido porque hay un CR antes del final de la línea.

La confirmación parece provenir de un GitHub PR y se fusionó mediante "squash y merge" con el post de confirmación editado a través de GitHub. Al mirar el post de confirmación en comparación con la confirmación original de git-subtree , encontrará que la confirmación original no incluye ningún byte CR en esa línea. (También volveremos al hecho de que ha sido "squash y se fusionó" más tarde, ¡ya que ha causado otros problemas!)

En cuanto a cómo resolver esto, el mejor enfoque que he encontrado es download una copy de git-subtree.sh y luego editar la function find_latest_squash para hacer eco de las references de confirmación esperadas; es decir, reemplace la function con:

 echo "960a3d21bab0293630da8919847f87f4af3a3198" "88c5c5b6bb675d0d95ae3ec4db3258768d0c8fc0" 

Una vez hecho esto, la ejecución de git-subtree producirá dos confirmaciones: una que actualice la copy de webidl2.js (cuya confirmación primaria es 960a3d21bab), pero debido a la acción previa anterior, esto dará como resultado una confirmación que borrará todo y agregará una nueva copy de webidl2.js (git-subtree espera tener un gráfico de confirmaciones que son literalmente solo el subtree, en la raíz, de vez en cuando con nuevos commits que squash; el "squash y merge" causó que la totalidad del repository aparezca en ese commit con el subtree en su ruta prefijada), y luego un commit de fusión que actualiza la copy del subtree en el repository.

Es importante, en el futuro, no modificar la confirmación de squash que crea el subtree de git porque el subtree de git es muy sensible a cualquier cambio en él.