Estoy involucrado en un proyecto con dos repositorios separados que pronto combinaremos en un monorepo. de lerna import
El comando será muy útil en este sentido, por lo que mantendremos los historiales de los proyectos.
Sin embargo, actualmente hay algunas ramas de funciones en progreso en los repositorios originales que probablemente no estarán listas cuando pasemos al monorepo. Tengo entendido que lerna import
solo extraerá la rama actualmente desprotegida del repositorio de origen, ¿es correcto?
Entonces, me preguntaba si había una manera de hacer la importación nuevamente, pero solo extraer las confirmaciones que se realizaron desde la última importación.
De esa manera, los equipos que trabajan en las ramas de características pueden fusionarse con el develop
rama una vez que estén listos y podemos traer eso al monorepo.
Alternativamente, ¿existen estrategias para lidiar con este escenario?
¿O tendré que esperar hasta que todo se fusione para develop
antes de hacer el lerna import
?
¡Gracias!
Usando la respuesta de @Doğancan Arabacı y el comentario de @Matt Mazzola. Pude hacer esto por mí mismo, pero agregué mi propia respuesta con algunos detalles más para tratar de dar una explicación más clara.
También enfrenté este problema como lerna import
solo le permitirá importar una vez si existe el directorio que no puede importar. Ver código aquí.
los lerna import
El comando toma todas las confirmaciones de su repositorio original, las invierte y las reproduce. Sin embargo, no hay forma de reproducirlos cuando las ramas divergen (como podría hacerlo con el git rebase --onto
dominio). Mira aquí Tengo la sensación de que podrías lograrlo usando git rebase
o utilizando una técnica similar para seleccionar dónde divergen las ramas para extender el lerna import
dominio. También tengo la sensación de que podría ensuciarse o tomarse un tiempo, por lo que la forma simple que existe actualmente es:
Para cada sucursal que desee importar:
Desde el repositorio original (conocido como original
:
- Paga y tira de la sucursal que deseas importar
- Corte una nueva rama de la rama que desea importar:
git checkout -b lerna-export
- Mueva todo a un directorio donde se importará, por ejemplo
packages/original
algo como:mkdir packages && mkdir packages/original
- Mueva todos sus archivos dentro del nuevo directorio:
git mv -k * ./packages/original
– es posible que tenga que copiar cualquier archivo que no esté seleccionado
Luego, desde el repositorio de Lerna:
- Agregue el repositorio original como un control remoto
git remote add original ###url of repo###
- Cambie a la sucursal a la que desea importar
git checkout -b orignal-import
- Combinar la rama de original a lerna:
git merge original/lerna-export --allow-unrelated-histories
- Solucione cualquier conflicto si tiene alguno
- Empuje a la sucursal de Lerna
git push
Después de todas las sucursales importadases posible que desee eliminar el segundo control remoto una vez que se hayan importado todas las sucursales: git remove rm original
Tuve algunos problemas con la seguridad en nuestra instancia de BitBucket ya que estaba impulsando confirmaciones de otros autores, así que tuve que reescribir el historial de git con git filter-branch
pero eso no parece totalmente relacionado con la pregunta para proporcionar detalles al respecto.
Doğancan Arabacı
No estoy seguro de qué está haciendo lerna debajo del capó, pero hay una forma manual de hacerlo con git. Hicimos algo similar en el pasado para 8-10 repositorios.
Supongamos que tenemos MonoRepo y TargetRepo
- Ir a MonoRepo
- git remoto agregar objetivo
- git pago -b característica1
- git merge target/feature1-branch-on-target
- repita los pasos 3 y 4 para todas las ramas deseadas.
- lucro
Puede repetir los pasos 3-4 cuando lo desee, después de algunas confirmaciones, haga todo en un día y pase a mono repositorio, etc.
-
No entiendo cómo funcionan estos comandos. Usted afirma “Hicimos algo similar en el pasado para 8-10 repositorios”. pero cuando lo intento no funciona. Veo 3 problemas: 1. No reproduce las confirmaciones de la misma manera que lo hace lerna import. 2. Con la combinación predeterminada, no puede combinar historias no relacionadas. El historial de la importación de lerna sería diferente a la rama de funciones del repositorio de destino. 3. No se ocupa de las diferentes estructuras de carpetas del repositorio mono y el repositorio de destino. El mono tiene proyecto en ./packages/target y target repo hat en su raíz ./ por lo que la fusión probablemente no sea sensata
–Mat Mazzola
22 de noviembre de 2019 a las 22:26
-
Otra razón por la que esta técnica puede ser útil es si desea importar varias sucursales. Según tengo entendido, la importación de lerna actualmente solo reemplaza la rama actualmente desprotegida de la ruta al repositorio de git que proporciona, sin embargo, si hay varias ramas, está atascado y es probable que necesite agregar esto manualmente más adelante. Después de más experimentación, descubrí que corrigía las rutas de las carpetas del objetivo antes de construir la combinación y usar la bandera
--allow-unrelated-histories
permite que la fusión funcione; sin embargo, dado que el historial no está relacionado, git ve todos los cambios como conflictos–Mat Mazzola
22 de noviembre de 2019 a las 22:58
-
esta respuesta necesita más aclaraciones para ganar más votos a favor.
– mesqueeb
5 sep 2020 a las 22:32