Solución detallada
Vea la nota al final de esta respuesta (último párrafo) para una alternativa rápida a los submódulos de git usando npm;)
En la siguiente respuesta, sabrá cómo extraer una carpeta de un repositorio y hacer un repositorio git de él y luego incluirlo como un submódulo en lugar de una carpeta.
Inspirado en el artículo de Gerg Bayer Mover archivos de un repositorio de Git a otro, preservando la historia
Al principio, tenemos algo como esto:
<git repository A>
someFolders
someFiles
someLib <-- we want this to be a new repo and a git submodule!
some files
En los pasos siguientes, me referiré a esto someLib
como <directory 1>
.
Al final, tendremos algo como esto:
<git repository A>
someFolders
someFiles
@submodule --> <git repository B>
<git repository B>
someFolders
someFiles
Cree un nuevo repositorio de git desde una carpeta en otro repositorio
Paso 1
Obtenga una copia nueva del repositorio para dividir.
git clone <git repository A url>
cd <git repository A directory>
Paso 2
La carpeta actual será el nuevo repositorio, así que elimine el control remoto actual.
git remote rm origin
Paso 3
Extraiga el historial de la carpeta deseada y consúltelo
git filter-branch --subdirectory-filter <directory 1> -- --all
Ahora debería tener un repositorio de git con los archivos directory 1
en la raíz de su repositorio con todo el historial de confirmaciones relacionado.
Paso 4
¡Cree su repositorio en línea y envíe su nuevo repositorio!
git remote add origin <git repository B url>
git push
Es posible que deba configurar la upstream
rama para su primer impulso
git push --set-upstream origin master
Limpio <git repository A>
(opcional, ver comentarios)
Queremos eliminar los rastros (archivos e historial de confirmaciones) de, <git repository B>
de <git repository A>
modo que el historial de esta carpeta solo esté allí una vez.
Esto se basa en Eliminar datos confidenciales de github.
Vaya a una nueva carpeta y
git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all
Reemplazar <directory 1>
por la carpeta que desea eliminar. -r
lo hará de forma recursiva dentro del directorio especificado :). Ahora empuja origin/master
con--force
git push origin master --force
Etapa de jefe (ver nota a continuación)
Cree un submódulo desde <git repository B>
en<git repository A>
git submodule add <git repository B url>
git submodule update
git commit
Verifique si todo funcionó como se esperaba y push
git push origin master
Nota
Después de hacer todo esto, me di cuenta de que en mi caso era más apropiado usar npm para administrar mis propias dependencias. Podemos especificar las URL y versiones de git, ver las URL de git package.json como dependencias .
Si lo haces de esta manera, el repositorio que desea utilizar como requisito debe ser un módulo de NPM por lo que debe contener un package.json
archivo o tendrá que obtener este error: Error: ENOENT, open 'tmp.tgz-unpack/package.json'
.
tldr (solución alternativa)
Puede que le resulte más fácil usar npm y administrar dependencias con git urls :
- Mover carpeta a un nuevo repositorio
- ejecutar
npm init
dentro de ambos repositorios
- ejecuta
npm install --save git://github.com/user/project.git#commit-ish
donde quieras que se instalen tus dependencias