git mercurial hgsubversion hg-git

¿Cómo relaciono un repositorio existente de Mercurial y git usando hg-git?



hgsubversion (3)

Esta es una pregunta bastante esotérica, así que para aclarar aquí desde el principio: no estoy hablando de convertir de svn a git, git a mercurial, o mercurial a git. Me refiero a una situación compleja que ha surgido al aprovechar los complementos de "sistemas cruzados" que permiten a Mercurial interoperar, en cierta medida, con git y SVN.

Durante algún tiempo he usado el complemento hg-subversion para Mercurial para "rastrear" un repositorio SVN en sentido ascendente en code.google.com. Gracias a este complemento, Mercurial considera que el repositorio está "relacionado" y es capaz de introducir solo los cambios que han ocurrido desde la última vez que retiré del repositorio. Esto me permite mantener mi propio repositorio privado de Mercurial que incluye conjuntos de cambios privados, sucursales, etiquetas, etc., pero que se sincroniza periódicamente y se combina con los cambios que se han producido en el repositorio SVN ascendente.

El repositorio anterior se ha movido, limpiamente, de SVN a git. Cuando digo claramente, me refiero a que se han llevado con ellos todo el árbol de confirmación, o al menos la parte que afecta a la rama predeterminada / maestra que me interesa.

Ahora estoy en una situación en la que tengo un repositorio de Mercurial que está actualizado y se fusionó con el último registro en el repositorio SVN ahora inactivo, y quiero comenzar a introducir cambios desde el nuevo repositorio de git ascendente, comenzando en el cambio que ocurrió justo después de que el repositorio svn se moviera a github.

Puedo usar el maravilloso complemento hg-git para extraer cambios de este repositorio, pero como el repositorio actual no tiene noción de estar "relacionado" con el repositorio de git en sentido ascendente, extraerá TODOS los cambios, incluidos todos los cambios cuyo conjunto de cambios de imagen espejo Ya están presentes en mi repositorio.

Entonces, lo que busco es un consejo sobre cómo puedo hacer que mi repositorio de Mercurial se considere a sí mismo, a través de hg-git, relacionado con el repositorio de git ascendente, y también considere todas las confirmaciones apropiadas del repositorio de git como "ya retiradas" para Propósitos de mantener la paridad del conjunto de cambios.

Veo que hg-git internamente parece usar un archivo .hg / git-mapfile que presumo que mapea los conjuntos de cambios entre el git ascendente y el repositorio local de Mercurial. Esta es probablemente una pista.

¿Cuál es la forma más fácil de obtener mi repositorio Mercurial local en un estado en el que esencialmente se comporta como si fuera un clon del repositorio git ascendente, pero mantiene todos mis conjuntos de cambios no relacionados que se han agregado a lo largo del tiempo?

(Nota: preferiría no "comenzar de nuevo" con un clon nuevo y luego aplicar mis cambios privados, porque quiero mantener la integridad histórica de este repositorio para mis propios propósitos de compilación / depuración).


Clonaría el nuevo repositorio ascendente con Hg-git, y luego intentaría usar la extensión Convert para unir todos los cambios en el antiguo repositorio local en el nuevo. De hecho, probablemente clonaría el repositorio local de Hg-git en un repositorio de Mercurial nativo y utilizaría una extracción de dos pasos del repositorio de Git en sentido ascendente.


He hecho algo similar con git antes. En el caso de git-> git pude hacer una combinación de git --strategy = ours que básicamente hizo que mi repositorio actual creyera que todo lo que se estaba fusionando era un no-op.

Lo que debe hacer es una rama que represente todo lo que usted sabe que ya está fusionado en su árbol y luego hacer un estilo de no fusión en su árbol y comenzar a introducir cambios con las combinaciones "reales".

Desde este sitio:

https://www.mercurial-scm.org/wiki/TipsAndTricks#Keep_.22My.22_or_.22Their.22_files_when_doing_a_merge

Veo que un comando como el siguiente puede ayudarlo a fusionarse en el repositorio ascendente e ignorar todo lo anterior:

$ hg --config ui.merge=internal:local merge #keep my files

Eso debería permitirte volver a sincronizar tu flujo descendente con el flujo ascendente.


Si no existe una solución existente, supongo que uno podría escribir un script que parche y confirme sus cambios en un nuevo repositorio basado en el git-clone. Usted "solo" necesita correlacionar las versiones svn entre hg-git-fromsvn y hg-svn, y replicar la secuencia update / patch / commit / merge que ha hecho en un nuevo repositorio.

Un proyecto divertido, para quien lo haga. :)