2012-02-12 13 views
5

Finalmente he migrado nuestro repositorio CVS a git. Lamentablemente, no usamos ramas en CVS, pero diferentes versiones/ramas se separaron en diferentes subdirectorios.Split Up Folders en un repositorio git en ramas separadas

I.E. tenemos la siguiente estructura de directorios:

/root 
    /lib 
    /tools 
    /src 
     /v1.0 
     /v2.0 
     /v3.5 

¿Hay una manera de separar las 3 versiones en el subdirectorio src en ramas separadas en lugar de mantener el directorio para cada versión?

He encontrado la misma pregunta aquí en Stack Overflow Question 4877053, donde se propone el uso de git-subárbol, pero incluso después de leer el manual de git-subárbol, no entendí cómo usarlo para resolver mi problema .

¿Puede alguien darme una explicación más detallada o incluso otra solución?

Soy bastante nuevo en Git, tal vez por eso no entendía el manual subárbol ;-)

Muchas gracias por todos sus anwers!

+0

¿Tiene historial de confirmaciones asociado con los diferentes directorios de versiones? Cuando migró el repositorio de CVS a git, ¿tiene ahora un historial que desea conservar? Estoy bastante seguro de que puedes dividir esos directorios usando una combinación de 'git filter-branch' y' git merge', pero es difícil de decir con certeza sin saber qué quieres conservar o qué quieres que se vea el repositorio final. me gusta. – simont

Respuesta

3

Depende de lo que desee dejar en el depósito después.

Si desea tres ramas, v1.0, v2.0, v3.5, todos con estructura como esta:

/root 
    /lib 
    /tools 
    /src 

entonces sí, estoy bastante seguro de que puede hacer eso. Usted va a terminar con algo como esto en términos de estructura de las ramas:

-- A -- B -- Current 
       | 
       |--- v1.0 
       |--- v2.0 
       |--- v3.5 

A, B, Current ser comete te has comprometido ya ha migrado a git, y donde v1.0, v2.0 y v3.5 son esencialmente "muerto "fin" ramas. Se podría hacer algunas cosas de lujo si se quiere obtener una estructura de ramas más como:

-- v1.0 --- v2.0 --- v3.5 -- A -- B -- Current 

Es decir, separada v1.0, v2.0 y v3.5 en sus propias ramas, entonces rebase v1.0 en v2.0, v2.0 en v3.5, y v3.5 en la primera confirmación en la versión actual.

Pero no estoy seguro exactamente de lo que quiere hacer.


¿Hay una manera de separar las 3 versiones en el subdirectorio src en ramas separadas en lugar de mantener el directorio para cada versión?

Sí, estoy bastante seguro de que puede hacerlo. Mi metodología es un poco ... intrincada, lo admitiré, pero aquí va. Por favor,, tenga cuidado y lea las páginas del manual - los siguientes comandos probablemente no lo estropearán todo, pero utilícelo bajo su propio riesgo.

  1. git checkout -b v1.0 - entrar en una nueva sucursal.
  2. Eliminar todo excepto v1.0. Hay algunas maneras de hacer esto. Esta pregunta tiene algunos métodos para eliminar todo excepto; No podría hacer que funcionen para mí, podría funcionar mejor para ti.

    `git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch src/v2.0" --prune-empty -f` 
    

    Esto eliminará src/v2.0y toda la historia asociada de la rama. -f no es necesario para este filtro; pero git-filter-branch hace algún tipo de copia de seguridad (lea la página de manual?) y podría escupir errores. Desafiadamente será la segunda vez que intentes git filter-branch.

    Repita esto para eliminar src/v3.5 también.

    Esto lo dejará con src/v1.0. Posiblemente desee cambiar la fuente de src/v1.0 a src; puede ejecutar git filter-branch --subdirectory-filter (lea la página man) para obtener una estructura de directorio /v1.0-files (no contiene nada más que los archivos del subdirectorio v1.0; ha movido los contenidos de v1.0 a root), y luego mire los ejemplos en la página man git-filter-branch (específicamente el ejemplo inferior) para desplazar los archivos a un subdirectorio. Eso podría ser excesivo, y luego necesitaría unir que en una rama que contiene todas las demás cosas que git filter-branch --subdirectory seleccionó; un simple mv v1.0/* . podría funcionar, pero luego tendría otro compromiso en su historial. No sé lo que preferirías.

    Así que ahora tiene v1.0 en su propia sucursal. ¡Hurra!

  3. Repita para v2.0 y v3.5.

Me temo que no puedo ver que esto sea más que una historia ... "extraña". Presumiblemente v2.0 tiene, esencialmente, v1.0 + mejoras; la estructura que he enumerado arriba (tres ramas "sin salida") muestra v2.0 y v3.5 no se basan en las versiones anteriores. No estoy del todo seguro de qué tipo de historia que tiene, si esto es un problema, etc, etc

Porque tienes v1.0, v2.0 y v3.5 en sus propias pequeñas ramas, puede git merge ellos o git rebase, etc, etc , si prefieres un historial con mejor aspecto.

Afortunadamente esto le da un poco de tiempo para pensar; como dije, lea las páginas del manual. :)

Cuestiones relacionadas