2010-11-22 8 views
6

He clonado accidentalmente a un depósito de la subversión sin añadir el argumento --stdlayout, darme algo como:recuperarse de Git-Svn clon sin --stdlayout

$ git svn clone --prefix=svn/ svn+ssh://code.example.com/project 
[two weeks later] 
$ git branch -a                         
* master 
    remotes/svn/git-svn 

Con el diseño svn/git-svn siendo algo así como:

branches/* 
tags/* 
trunk/* 

¿Alguna manera de recuperarse de esto?

Respuesta

3

Actualmente, parece que un nuevo inicio es la única opción que mantendrá la interoperabilidad con SVN.

+2

no es la única opción, pero la más fácil. Si reescribe la línea git-svn-id y elimina rev_map, git-svn puede reconstruirlos para usted. –

2

Eso depende: ¿quieres poder interoperar con la subversión en el futuro?

De lo contrario, considere crear manualmente una bifurcación en git para cada bifurcación en branches y mover los contenidos de ese directorio de bifurcación hasta el nivel superior. Eso te compromete a trabajar, y el cambio de nombre de git debería significar que mirar el historial funciona razonablemente bien. Si desea etiquetas, puede crear de manera similar una rama para cada etiqueta, etiquetarla y luego eliminar la rama.

Esto no es bonito, pero debería ser viable.

Más trabajo sería usar git filter-branch para volver a escribir el historial de cada una de las ramas que acaba de crear de la misma manera que volvió a escribir la sugerencia. Esto debería dejarte con un repositorio que parece correcto. Sin embargo, aún no obtendría la integración de subversión, y tendría que averiguar cómo lidiar con el punto de ramificación original.

Mucho, mucho más trabajo sería resolver cómo git svn almacena sus metadatos y transforma el repositorio (probablemente de nuevo usando git filter-branch) en consecuencia, todos los datos deberían estar allí :).

+0

git-svn almacenar los metadatos en dos lugares: la línea 'git-svn-id' en el mensaje de confirmación y el archivo' .git/svn/* /. Rev_map'. .. Si elimina el 'rev_map', se regenerará a partir de' git-svn-id' –

3

No es una respuesta exacta, pero lo que hice fue agregar el indicador -r para especificar solo los últimos commits, ya que de todos modos no quería commits desde hace un año.

git svn clone --prefix=svn/ -s -r12000:HEAD http://some/svn/repo

Esto requiere que usted sabe qué número de revoluciones que desea volver a, en este caso, 12000. Se me permitió mantener mi cordura después de perderse la bandera -s e hice lo que realmente quería hacer en primer lugar en un tiempo razonable.