Tengo una aplicación web que explora otras aplicaciones web de una manera particular. Contiene algunas demostraciones web en una demos
carpeta y una de las demostraciones ahora debería tener su propio repositorio. Me gustaría crear un repositorio separado para esta aplicación de demostración y convertirlo en unsubpaquete submódulo del repositorio principal sin perder su historial de confirmaciones.
¿Es posible mantener el historial de confirmaciones de los archivos en la carpeta de un repositorio y crear un repositorio a partir de él y usarlo como un submódulo ?
git
git-submodules
revision-history
GabLeRoux
fuente
fuente
Respuestas:
Solución detallada
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:
En los pasos siguientes, me referiré a esto
someLib
como<directory 1>
.Al final, tendremos algo como esto:
Cree un nuevo repositorio de git desde una carpeta en otro repositorio
Paso 1
Obtenga una copia nueva del repositorio para dividir.
Paso 2
La carpeta actual será el nuevo repositorio, así que elimine el control remoto actual.
Paso 3
Extraiga el historial de la carpeta deseada y consúltelo
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!
Es posible que deba configurar la
upstream
rama para su primer impulsoLimpio
<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
Reemplazar
<directory 1>
por la carpeta que desea eliminar.-r
lo hará de forma recursiva dentro del directorio especificado :). Ahora empujaorigin/master
con--force
Etapa de jefe (ver nota a continuación)
Cree un submódulo desde
<git repository B>
en<git repository A>
Verifique si todo funcionó como se esperaba y
push
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 :
npm init
dentro de ambos repositoriosnpm install --save git://github.com/user/project.git#commit-ish
donde quieras que se instalen tus dependenciasfuente
cd someLib
antes del paso 2? Dices "La carpeta actual será el nuevo repositorio" pero en realidad no lo será; el nuevo repositorio (submódulo) está dentro de esa carpeta.refs/original/...
que se crea en el paso 3.La solución de @GabLeRoux aplasta las ramas y las confirmaciones relacionadas.
Una forma sencilla de clonar y mantener todas esas ramas y confirmaciones adicionales:
1 - Asegúrate de tener este alias de git
2 - Clone el control remoto, tire de todas las ramas, cambie el control remoto, filtre su directorio, presione
fuente
La solución de GabLeRoux funciona bien, excepto si usa
git lfs
y tiene archivos grandes en el directorio que desea separar. En ese caso, después del paso 3, todos los archivos grandes seguirán siendo archivos de puntero en lugar de archivos reales. Supongo que probablemente se deba a que el.gitattributes
archivo se eliminó en el proceso de la rama del filtro.Al darme cuenta de esto, encuentro que la siguiente solución funciona para mí:
Copiando
.gitattributes
qué git lfs usa para rastrear archivos grandes al.git/
directorio para evitar ser eliminados.Cuando termine la rama de filtro, no olvide volver a colocar
.gitattributes
si aún desea usar git lfs para el nuevo repositorio:fuente