2010-11-22 17 views
5

He estado felizmente usando git en mi máquina para un proyecto "MyProject". MyProject es en realidad parte de un esfuerzo de investigación en colaboración más grande "WholeThing". Prácticamente no hay superposición entre myProject y OtherProjects en WholeThing.Migrando el repositorio git local al repositorio remoto más grande mientras reescribo las rutas

Ahora, Big Bosses ha decidido poner todo el desarrollo en un repositorio central de git (para documentación y copia de seguridad). Tiene sentido para mí hasta ahora.

Supongamos que no tengo acceso privilegiado al repositorio central.

El problema es, que MiProyecto mapea en un subdirectorio de la WholeThing, es decir

local repo: 
MyProject -| 
      |- .git 
      | 
      |- dirs 


remote repo: 
WholeThing -| 
      |- .git 
      | 
      |- Area1 
      | 
      |- Area2 
       |------ MyProject 
       |------ DudesProject 

¿Cómo llego a mi repositorio local en el subdirectorio adecuado en el repositorio central y preservar la historia y las ramas ?

Yo (creo que) entiendo ramas remotas y cosas, pero todavía no he encontrado una manera de prefijar la ruta del archivo de MyProject con "WholeThing/Area2" salvo mover los archivos en mi repositorio local y crear un cometer antes de empujar. Seguramente debe haber otra manera?

Tampoco me importa clonar WholeThing y navegar hacia MyProject una vez que se haya completado la migración ... así que no estoy buscando submódulos o similares (y no tengo acceso administrativo al repositorio central) .

¡Todas las ideas son bienvenidas!

Saludos, José

Respuesta

3

Gracias por las respuestas hasta ahora ... me hizo formular la pregunta de manera diferente en Google.

La respuesta está escrita en la página de manual, solo tiene que leer hasta el final.

La solución es reescribir el historial con git filter-branch y reescribir la ruta de cada archivo mientras lo hace. Reescribir la ruta se puede hacer en principio con --tree-filter (creo), o con --index-filter, que es mucho más rápido.

El siguiente fragmento de código se toma casi textualmente de la página de manual git help filter-branch, que acaba de editarse para reflejar los directorios en mi ejemplo. Solicita cada confirmación para las rutas del archivo involucrado, las reescribe prefijando "WholeThing/Area2/MyProject /" y reproduce las confirmaciones.

git filter-branch --index-filter \ 
    'git ls-files -s | sed "s-\t-&WholeThing/Area2/MyProject/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
    git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 

El siguiente paso (con suerte simple) consiste en agregar el repositorio remoto y pulsarlo.

¡Salud! & gracias!

0

lo ideal es que su propio proyecto MyProject.git sub bajo Wholething/Area2.

Si sus jefes quieren tener solo un repositorio git para cada proyecto, eso no tiene sentido, pero si lo quieren de todos modos, eso significa que el árbol WholeThing es un árbol nuevo totalmente diferente de su y así, usted no puede hacer nada excepto extraer todo, agregar su directorio e insertar todo (así como DudesProject) (NO puede trabajar en un subconjunto o subdirectorio de un árbol git). De todos modos, como serían 2 árboles diferentes, perderás toda tu historia y esas cosas.

La forma correcta de hacer cosas es tener un árbol git por proyecto y, por lo tanto, no hay git en WholeThing. Con la forma correcta, "WholeThing/Area2" aparece naturalmente en la url cuando agrega la rama remota.

1

sí, el siguiente paso es agradable y sencilla

git remote add other [path/to/repo] 
git fetch other 
git checkout -b other-master other/master 
git checkout master 
git merge other-master 

y usted debe ser bueno para ir

Cuestiones relacionadas