2012-07-11 14 views
7
  1. Tengo la raíz Mercurial repo (sitio web).
  2. Yo clono WordPress de GitHub mirror en el subdirectorio /wp.
  3. Como deseo una versión muy específica (estable) de WP, pero no desarrollo en curso, lo hago git checkout 3.4.1 (donde 3.4.1 es una etiqueta).
  4. Lo configuro como subrepo en el Repo y compromiso de Mercurial de la raíz (la revisión de WP se captura bien en .hgsubstate).

Y aquí comienza el problema. Hago hg push y cuando se llega a WP:Cómo solucionar Mercurial atascado en Git subrepo push?

no branch checked out in subrepo wp 
cannot push revision e9bc63e25dc40c07ac3a6778dc2b48e1aa486e36 

Y entonces, sólo se cierra. Push for root repo ni siquiera se intentó.

entiendo por qué Mercurial intentos para empujar subrepo (comportamiento previsto), pero no pueden dar sentido a eso que se las arregla para fallar por completo en subrepo que:

  1. no tiene cambios
  2. ha leído -solo origen de todos modos

¿Cómo hacer que entienda que quiero esta revisión específica y no quiero que se meta con el subrepo de Git?

Respuesta

2

Te encontrarás con un par de problemas con esta configuración.

En primer lugar, parece que mercurial no puede manejar git subrepos con un HEAD separado.

Cuando ejecuta git checkout 3.4.1, su repositorio entra en un estado detached HEAD (debería haber visto una advertencia a tal efecto cuando ejecutó el comando). En ese punto, si ejecuta git branch, verá que (no branch) aparece como la rama activa. Cuando mercurial intenta empujar, se ahoga en este estado. Puede preguntar al mercurial developer list por qué sucede esto, pero probablemente sea una limitación de la implementación del subrepo existente.

Segundo, mercurial usa un comando push para sincronizar git subrepos.

Si ejecutara git checkout -b <integration_branch> 3.4.1, moverá git fuera del estado de HEAD desconectado. Sin embargo, cuando intente hg push, intentará presionar al repositorio remoto de git. Para un subrepo mercurial, puede verificar los cambios salientes incluso si no tiene acceso de inserción al control remoto. Sin embargo, GitHub requiere que se autentique antes de que le diga si los dos repos están sincronizados. Por lo tanto, si no tiene acceso de inserción al control remoto git, esto no funcionará. Esto es parte del diseño de la estrategia de subrepo de Mercurial.

Si es necesario continuar con esta configuración, probablemente debería hacer lo siguiente:

  1. Crear su propio tenedor de la cesión temporal de WordPress en GitHub.
  2. Clona tu tenedor en el directorio de subrepos mercurial.
  3. git checkout -b <branch_name> 3.4.1
  4. continuar desde allí

Hay algo de información adicional en este related question.

+0

Sí, parece que el problema es la cabeza desprendida (aunque yo lo veo como un defecto de Git no Mercurial, si no tiene nada que empujar, ¿qué importancia tiene la ramificación activa?). Sin embargo, su segundo punto parece ser no problemático, otros subinformes de GitHub actualizados para que la revisión de la propina funcione bien. Mi solución actual es crear y usar el espejo Mercurial de WordPress, pero aún me interesa si este material separado puede funcionar como subrepo sin clonar y ramificar cosas alrededor ... – Rarst

+0

@Rarst: siempre que tus otros subrepos de GitHub apunten a 'consejo ', estará bien. Pero tan pronto como cree una sucursal local de git para utilizar una revisión anterior (por ejemplo, use una etiqueta más antigua, sin un HEAD separado), obtendrá el mismo error. –