2009-12-01 24 views
6

Estoy resucitando un proyecto de código bastante antiguo, desde cuando estaba usando CVS regularmente, como un componente en un nuevo proyecto que ya he estado trabajando en el uso de git. Todavía tengo acceso al archivo de CVS en el que está el módulo del proyecto anterior, así que solo iba a usar git-cvsimport para obtener el historial de compromisos e ir desde allí. Sin embargo, esto es solo crear un nuevo repositorio git dentro del actual. Es completamente posible que necesite hacer esto como un proceso de múltiples pasos donde voy a CVS -> repositorio git fresco y luego uso algo más para acceder al repositorio git existente.Cómo importo un módulo CVS existente en un subdirectorio de un repositorio git existente

La ejecución de este en newproj/newsubdir ($ CVSROOT está ya configurado correctamente en la configuración de mi concha):

git cvsimport -k -o master -u -s \- -A ~/Documents/cvs-authors.txt oldproj 

me consigue un nuevo repositorio newproj/newsubdir/.git/con todas las confirmaciones correctas (comentarios, marcas de tiempo, historial), y con HEAD donde lo desee.

Lo que quiero es que los CVS históricos se comprometan a ser como si siempre estuvieran en newproj/newsubdir/oldproj-file1, newproj/newsubdir/oldproj-file2, etc. En mi experiencia, git tiene la magia para hacer esto tipo de cosas, pero no pude encontrar un ajuste obvio a mi situación.

Respuesta

0

descubierto la manera de hacer lo que quiero basado en this answer for combining git repositories, usando git filter-branch para que sea como si el módulo importado de CVS se había fusionado directamente en el subdirectorio deseado en el repositorio Git existente

A partir de el directorio que contiene newproj, el repositorio Git existente:

% git cvsimport -k -u -s \- -A ~/Documents/cvs-authors.txt \ 
    -C newproj-sibling oldproj 
% cd newproj-sibling 
% git filter-branch --index-filter \ 
    'git ls-files -s | gsed "s-\t-&subdir/of/newproj/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
    git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 
% cd ../newproj 
% git pull ../newproj-sibling master 

Asumiendo el subdirectorio de destino en el repositorio git era completamente nuevo, o al menos no contenía archivos que comparten nombres con los del módulo de CVS, la fusión debe apagarse sin problemas.

Una advertencia: He avanzado porque la BSD sed que viene con OS X no puede hacer escapes de caracteres como \ t, y no me he molestado en alias todavía.

2

Tiene tres opciones. Todos ellos comienzan con hacer el cvsimport limpio, así que adelante y hazlo.

  1. Referencia que repo como un submódulo.
  2. Obtenga el repositorio en el repositorio existente y realice una combinación de subárbol para unir los historiales.
  3. Haga algo similar al # 3, y luego vuelva a injertar el árbol para intercalar los compromisos cronológicamente a lo largo de la historia.

El número uno significa que el proyecto externo depende del interior, pero probablemente no sea deseable para usted.

El número dos se explica en este subtree merge howto. Puede ser lo suficientemente bueno para ti.


Pero si te gusta una buena historia lineal limpio, se puede hacer # 3 y enredo ellos para siempre. Hice something similar en un proyecto de limpieza hace un tiempo y todavía tengo mucha documentación y herramientas.

La idea básica era separar todos los cambios en un historial de parches que reconstruiría los cambios. De forma predeterminada, este historial está en una especie de orden de repositorio, pero al ejecutar el script que mencioné en la publicación se reorganizarán los parches en una nueva secuencia en orden cronológico.

El hash arbóreo debe indicarle que no ha roto nada que no sea el linaje.

Si tuviera que hacer esto de nuevo, posiblemente solo emitiría un archivo de injertos y haría un filter-branch.

+0

D'oh, respondiste mientras me respondía. Maldiciona mi impaciencia! – UltraNurd

Cuestiones relacionadas