Saltar al contenido

Fusionar dos repositorios de Git sin romper el historial de archivos

Solución:

Resulta que la respuesta es mucho más simple si simplemente está tratando de unir dos repositorios y hacer que parezca que fue así todo el tiempo en lugar de administrar una dependencia externa. Simplemente necesita agregar controles remotos a sus repositorios antiguos, fusionarlos con su nuevo maestro, mover los archivos y carpetas a un subdirectorio, confirmar el movimiento y repetir para todos los repositorios adicionales. Los submódulos, las fusiones de subárboles y las rebases sofisticadas están destinados a resolver un problema ligeramente diferente y no son adecuados para lo que estaba tratando de hacer.

Aquí hay un script de Powershell de ejemplo para unir dos repositorios:

# Assume the current directory is where we want the new repository to be created
# Create the new repository
git init

# Before we do a merge, we have to have an initial commit, so we'll make a dummy commit
git commit --allow-empty -m "Initial dummy commit"

# Add a remote for and fetch the old repo
# (the '--fetch' (or '-f') option will make git immediately fetch commits to the local repo after adding the remote)
git remote add --fetch old_a <OldA repo URL>

# Merge the files from old_a/master into new/master
git merge old_a/master --allow-unrelated-histories

# Move the old_a repo files and folders into a subdirectory so they don't collide with the other repo coming later
mkdir old_a
dir -exclude old_a | %{git mv $_.Name old_a}

# Commit the move
git commit -m "Move old_a files into subdir"

# Do the same thing for old_b
git remote add -f old_b <OldB repo URL>
git merge old_b/master --allow-unrelated-histories
mkdir old_b
dir –exclude old_a,old_b | %{git mv $_.Name old_b}
git commit -m "Move old_b files into subdir"

Obviamente, podría fusionar old_b en old_a (que se convierte en el nuevo repositorio combinado) si prefiere hacer eso: modifique el script para adaptarlo.

Si también desea traer ramas de funciones en progreso, use esto:

# Bring over a feature branch from one of the old repos
git checkout -b feature-in-progress
git merge -s recursive -Xsubtree=old_a old_a/feature-in-progress

Esa es la única parte no obvia del proceso: no es una fusión de subárbol, sino más bien un argumento de la fusión recursiva normal que le dice a Git que cambiamos el nombre del objetivo y eso ayuda a Git a alinear todo correctamente.

Escribí una explicación un poco más detallada aquí.

Esta es una forma que no reescribe ningún historial, por lo que todos los ID de confirmación seguirán siendo válidos. El resultado final es que los archivos del segundo repositorio terminarán en un subdirectorio.

  1. Agregue el segundo repositorio como remoto:

    cd firstgitrepo/
    git remote add secondrepo [email protected]:andsoon
    
  2. Asegúrese de haber descargado todas las confirmaciones del segundo repositorio:

    git fetch secondrepo
    
  3. Cree una rama local a partir de la rama del segundo repositorio:

    git branch branchfromsecondrepo secondrepo/master
    
  4. Mueva todos sus archivos a un subdirectorio:

    git checkout branchfromsecondrepo
    mkdir subdir/
    git ls-tree -z --name-only HEAD | xargs -0 -I {} git mv {} subdir/
    git commit -m "Moved files to subdir/"
    
  5. Fusiona la segunda rama en la rama maestra del primer repositorio:

    git checkout master
    git merge --allow-unrelated-histories branchfromsecondrepo
    

Su repositorio tendrá más de una confirmación de root, pero eso no debería representar un problema.

Han pasado algunos años y hay soluciones bien fundamentadas que se han votado positivamente, pero quiero compartir la mía porque fue un poco diferente porque Quería fusionar 2 repositorios remotos en uno nuevo sin eliminar el historial de los repositorios anteriores.

  1. Crea un nuevo repositorio en Github.

    ingrese la descripción de la imagen aquí

  2. Descargue el repositorio recién creado y agregue el antiguo repositorio remoto.

    git clone https://github.com/alexbr9007/Test.git
    cd Test
    git remote add OldRepo https://github.com/alexbr9007/Django-React.git
    git remote -v
    
  3. Busque todos los archivos del antiguo repositorio para que se cree una nueva rama.

    git fetch OldRepo
    git branch -a
    

    ingrese la descripción de la imagen aquí

  4. En la rama maestra, realice una fusión para combinar el antiguo repositorio con el recién creado.

    git merge remotes/OldRepo/master --allow-unrelated-histories
    

    ingrese la descripción de la imagen aquí

  5. Cree una nueva carpeta para almacenar todo el nuevo contenido creado que se agregó desde OldRepo y mueva sus archivos a esta nueva carpeta.

  6. Por último, puede cargar los archivos de los repositorios combinados y eliminar de forma segura OldRepo de GitHub.

Espero que esto pueda ser útil para cualquiera que se ocupe de fusionar repositorios remotos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *