¿Hay alguna forma de “actualizar” un repositorio importado con Lerna?

4 minutos de lectura

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-branchpero eso no parece totalmente relacionado con la pregunta para proporcionar detalles al respecto.

avatar de usuario
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

  1. Ir a MonoRepo
  2. git remoto agregar objetivo
  3. git pago -b característica1
  4. git merge target/feature1-branch-on-target
  5. repita los pasos 3 y 4 para todas las ramas deseadas.
  6. 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

¿Ha sido útil esta solución?