La estrategia de fusión del subtree Git, ¿es posible sin fusionar la historia?

He intentado alejarme de los submodules para get un repository autónomo, y la estrategia de combinación de subtreees parece coincidir con este caso de uso.

Sin embargo, los historiales de repositorys combinados aparecen en la historia de mi propio proyecto, que es bastante molesto.

He intentado con git filter-branch --subdirectory-filter path/to/subtree/ HEAD que funciona … hasta que bash actualizar un subtree con git pull -s subtree my-subtree master que reescribe todos los files del subtree a mi raíz del proyecto

¿Hay alguna forma de lograr esto de forma nativa en git?

El subtree git de --squash tiene una opción --squash que puede hacer casi lo que usted quiere.

 remote=libfoo branch=master prefix=helpers/libfoo git fetch "$remote" && git subtree add --prefix="$prefix" --squash "$remote/$branch" : Later, once there are changes to pick up. git subtree pull --prefix="$prefix" --squash "$remote" "$branch" 

El subtree de git registra información adicional en los posts de confirmación de las confirmaciones que genera; esta información adicional le permite realizar fusiones de manera efectiva sin tener que incorporar la historia real del subtree que se fusiona.


Si sabes que nunca harás ningún cambio en el subtree en el repository "super" (es decir, todos los cambios en el subtree siempre vendrán de otro repository), entonces podrías hacerlo sin el subtree git y simplemente repetir la git read-tree --prefix= parte del método de combinación de subtree (aunque primero debe limpiar su subtree actual del índice).

 remote=libfoo branch=master prefix=helpers/libfoo/ : replace the local subtree with whatever the other repository has git fetch "$remote" && git rm -r --ignore-unmatch "$prefix" && git read-tree --prefix="$prefix" "${remote}/${branch}" && git checkout -- "$prefix" && git commit -m "update $prefix from $remote $branch" 

Si solo es una molestia cuando lee 'git log', entonces puede intentar:

 git log --first-parent 

Solo muestra sus confirmaciones y las asignaciones de fusión (únicas), pero no las confirmaciones del control remoto.

Si desea verlo con un diff (que creará una gran diferencia para los commit de fusión):

 git log -p -m --first-parent 

No se necesitan herramientas adicionales 🙂