2011-07-09 10 views
10

Desde hace un tiempo, he estado duplicando un repositorio de Subversion en un repositorio de Git. Lo cual siempre funcionó bien. Sin embargo, debido a un bloqueo de un servidor virtual y al no tener una copia de seguridad, tengo que configurar el espejo nuevamente. El repositorio que necesito rastrear es casi 1200 commits grande y contiene muchos archivos (que es la razón principal para el espejo Git, ya que es mucho más rápido obtener una copia del repositorio).Vuelva a habilitar la duplicación con git-svn

Lo que tengo que hacer ahora es hacer que mi espejo Git recién clonado haga un seguimiento del repositorio de Subversion nuevamente. No tengo problemas para agregar la nueva referencia remota, pero parece que no puedo encontrar la manera de volver a convertir svn commits en la rama de Git.

Un error que parece recibir es Unable to determine upstream SVN information from working tree history.

¿Cómo puedo volver a habilitar la duplicación de un repositorio de Subversion en una sucursal de Git existente que está solo detrás de un par de confirmaciones del repositorio de Subversion?

+0

Por lo que yo sé, no hay una forma sencilla de hacer eso.(Y si hay una forma complicada, no lo sé). – svick

Respuesta

11

La manera más fácil de hacer que funcione nuevamente es copiar el directorio .git/svn del original, ya que aquí es donde se rastrean los metadatos svn adicionales (suponiendo que la configuración de git-svn sea la misma).

Sin embargo, puesto que no tiene que probar esto:

  1. git svn init http://hostname/svn/repository con cualquier otro parámetro que ha utilizado antes (? Quizá -s)

  2. git checkout la última confirmación desde SVN.

  3. recrear la ref git-svn: git update-ref refs/remotes/git-svn HEAD (o si se ha utilizado -s, esto debería ser refs/remotes/trunk lugar)

  4. obtener los últimos desde SVN desde comprometen la corriente: git svn fetch --parent. Esto debería reconstruir los metadatos de git-svn para todo tu historial.

+0

¡Gracias, esto funcionó! No puedo otorgar la recompensa todavía (tendré que esperar 9 horas, al parecer) – Htbaa

+0

No entiendo muy bien el pasaje 'git checkout'. ¿Qué debo pagar? –

+0

Un candidato probable es 'maestro', a menos que haya estado cometiendo' maestro' desde que recibió la última versión de git-svn. Básicamente, quieres 'pagar' el último compromiso que ves en 'git log' que tiene información SVN en el mensaje de confirmación, para que git-svn pueda retomar donde lo dejó. – dahlbyk

0

me encontré con otro método en http://trac.parrot.org/parrot/wiki/git-svn-tutorial:

Adición de metadatos git-svn al clon github

Si desea volver a poblar los metadatos SVN, que rápidamente se puede hacer por tomando su clon actual del repo de leto fuera de gihub y agregando esto a su .git/config

[svn-remote "svn"] 
     url = https://svn.parrot.org/parrot 
     fetch = trunk:refs/remotes/trunk 

A continuación, ejecute este comando para encontrar el "top cometer"

git show origin/upstream | head -n 1 

y poner esa confirmación de hash en un archivo .git/refs/mandos a distancia/tronco (obviamente reemplazar la tiene con la del comando anterior)

echo c85aaa38b99cedb087e5f6fb69ce6d4a6ac57a0b > .git/refs/remotes/trunk 

y finalmente

git svn fetch 
Cuestiones relacionadas