GIT SVN: obteniendo una twig recreada de SVN sin el padre de fusión incorrecto

Tengo la siguiente situación con mi repository svn upstream:

svn una twig svn y svn en ella, lo que me llevó a una historia realmente intrincada. Así que lo borré de nuevo, reteniendo los commit de git, lo que me permitió limpiar el historial bastante bien.

Una vez que tuve mi serie de parches list, volví a clonar mi twig usando svn copy , seguido de un git svn fetch . La idea era que, a continuación, rebase el historial de limpieza en la nueva twig svn , para poder publicarlo fácilmente con git svn dcommit .

Sin embargo, git svn fetch no hizo lo que esperaba. Esto es lo que esperaba (fake git log --oneline --decorate --graph output):

 * xxxxxxx (svn-branch) * xxxxxxx (svn-parent-branch) ... somewhere further down, unrelated to the above * xxxxxxx (old-svn-branch-head) 

Pero esto es lo que obtuve:

 * xxxxxxx (svn-branch) |\ | * xxxxxxx (svn-parent-branch) | * xxxxxxx (old-svn-branch-head) 

Como puede ver, git svn fetch ignoró por completo el hecho de que la twig svn fue eliminada, mapeando la recreación de svn commit a una fusión commit en git . Ahora, no me preocuparía por esto, si esto no tuviera ninguna consecuencia, pero desafortunadamente, la connection incorrecta confunde los algorithms de fusión de git , creando falsos conflictos de combinación cuando se rebase a través de la nueva database commit.

Entonces mi pregunta es: ¿Cómo puedo atraer a git svn fetch para que no vincule la nueva database commit con el padre incorrecto, o de alguna manera arreglar mi git repo de manera que conserve la capacidad de publicar mis cosas con git svn dcommit ? Por supuesto, siempre puedo eliminar todo de nuevo, y crear una nueva twig svn con un nombre diferente, pero me preguntaba si existe una mejor solución.

Encontré una situación similar y aún no pude encontrar una manera de desactivar este comportamiento ( --no-follow-parent desactiva el seguimiento de la twig completa, que no es lo que quiero).

Terminé arreglando la historia con git replace --graft . Crea un compromiso de reemploop y mantiene a sus hijos sin cambios . Después del reemploop (por ejemplo, git replace --graft svn-branch svn-parent-branch ) esto es lo que ves:

 * svn-branch | * svn-parent-branch ... * old-svn-branch-head 

Todavía puede ver la confirmación original con la opción gitk --all .

 * svn-branch (replacement) | | * svn-branch (original) |/| * | svn-parent-branch | | | * old-svn-branch-head ...