¿Cómo agregar proyectos ya clonados como submódulos?

6 minutos de lectura

Tengo en una carpeta una gran cantidad de proyectos que cloné durante bastante tiempo; Recientemente moví toda esta carpeta a uno de mis repositorios y me gustaría convertir estos proyectos clonados en submódulos para poder actualizarlos y controlarlos mejor en el futuro. He buscado mucho en Google sobre cómo hacer esto, pero todos los tutoriales solo hablan sobre cómo agregar submódulos nuevos. ¿Alguien puede ayudarme?

avatar de usuario de neevek
neevek

Agregar un repositorio git existente como un submódulo es lo mismo que agregar uno nuevo.

  1. Primero haga que la carpeta que contiene todos sus repositorios de git sea un repositorio de git con git init.
  2. Usar git submodule add https//example.com/remoterepo ./localrepodónde ./localrepo es su repositorio git existente.
    • Nota: obtienes la URL para remoterepo de localrepo/.git/config.
  3. Repita el segundo paso para todos sus repositorios existentes que desee agregar como submódulos.
  4. Ahora puedes correr git submodule foreach git pull para actualizar todos sus subproyectos.

Es posible que desee escribir un pequeño script para automatizar el segundo paso si tiene muchos submódulos, lo que no debería ser difícil.

Editar

Lo siguiente es lo que usé para intentar reproducir el error mencionado en los comentarios. Revisé tres veces los comandos y todavía no puedo ver el error:

git --version

mkdir submoduletest
cd submoduletest

git init --bare remote_repo_A
git init --bare remote_repo_B 

git clone remote_repo_A local_repo_A
git clone remote_repo_B local_repo_B

cd local_repo_A
echo "test commit on repo B" >> test.txt
git add test.txt
git commit -m 'test commit message'
git push origin master

cd ../local_repo_B
echo "test commit on repo B" >> test.txt
git add test.txt
git commit -m 'test commit message'
git push origin master

cd ../local_repo_A
git clone ../remote_repo_B local_repo_B
git submodule add ../remote_repo_B ./local_repo_B
git submodule foreach git pull origin master

git add .
git ci -m 'we just added a submodule for remote_repo_B'

git submodule status

Utilice el siguiente comando para comprobar el estado actual de local_repo_Asolo tiene dos objetos blob, uno para ‘test.txt’ y otro para el archivo ‘.gitmodules’ creado implícitamente, nada de remote_repo_B se agregan a la índice de local_repo_A.

find .git/objects -type f | awk -F/ '{print $3$4}' | xargs -I {} git cat-file -t {} | grep blob

La razón por la que revertí las ediciones es porque las ediciones son simplemente INCORRECTAS, ya estaban rechazado por otros dos mediadores y yo, pero luego otro tipo lo aprobó, no estoy seguro si es un error de SO o qué. Pero las ediciones son rechazadas, incluso ahora porque están totalmente equivocadas. Ya expliqué por qué en los comentarios.No soy ofensivo para nadie, pero esto me hizo perder el tiempo, deséchelo si la respuesta no es útil para usted.

Nuevamente, si no lo está mejorando, NO edite mi respuesta.

  • Parece la solución correcta. Anoche tenía prisa y decidí eliminar y volver a agregar todos los repositorios al final. Pero igual gracias por tu respuesta! Aunque me pregunto si de todos modos no necesita ingresar la URL (la URL remota debe estar presente en algún lugar del repositorio existente, simplemente no tengo idea de cómo extraer eso …)

    – L__

    24 de mayo de 2013 a las 13:48

  • Aparece el error “ya existe en el índice”. @lynnard ¿Probó la respuesta antes de verificarla? Si no es así, le insto a que lo haga porque esto es engañoso.

    – Muhsin Fatih

    28/01/2018 a las 22:50

  • @lynnard De hecho, resolví el problema y sugerí una edición. ¡Salud!

    – Muhsin Fatih

    28 de enero de 2018 a las 23:11

  • @MuhsinFatih, obtiene el error “ya existe en el índice” porque no siguió las instrucciones tal cual, debe haber agregado los repositorios secundarios como directorios normales al repositorio principal antes de agregarlos como submódulos, en ese caso lo harán no ser tratados como submódulos. Por cierto, la edición se rechaza porque eso no es parte de la respuesta, sino algo que uno debería aprender sobre el submodule comando o git en general.

    – neevek

    29 de enero de 2018 a las 7:58

  • @neevek Pero eso no es lo que ha pedido el OP. Dijo que ya tiene un repositorio de git que contiene los otros repositorios de git que será difícil de descargar nuevamente. Además, como dije “repositorio ya clonado” para el paso n. ° 2, si una persona no tiene ninguno, simplemente puede omitir el paso. Además, su declaración: “Agregar un repositorio git existente como un submódulo es lo mismo que agregar uno nuevo” es incorrecta y entra en conflicto con su comentario; ¿Desea agregar “repositorios git existentes” en el repositorio como submódulos, o desea agregar “nuevos repositorios get” como submódulos?

    – Muhsin Fatih

    29 de enero de 2018 a las 8:07


Para agregar muchos submódulos, escribí este ciclo simple:

for repo in vim/bundle/*
do
  echo $repo
  pushd $repo
  url=$(git remote get-url $(git remote))
  echo $url
  popd
  git submodule add $url ./$repo
done

Limitaciones obvias que no me molesté en arreglar:

  • no es necesario cambiar de directorio, estoy bastante seguro de que puede pasar el directorio git como argumento para los comandos
  • git remote en realidad devuelve todos los controles remotos, no solo el actual, por lo que la secuencia de comandos se interrumpirá si hay varios

  • En cuanto a la primera limitación: pushd y popd debe ser reemplazable por el -C <path> opción de git, es decir, git -C $repo submodule add $url ./$repo. La segunda limitación debe ser solucionable usando for remote in $(git remote); do ...; done dónde ... es la declaración de la variable url, el eco y el submódulo. Pero como no lo probé (todavía), no editaré la respuesta para esto.

    – Valentín Kuhn

    8 de septiembre a las 7:54

Agregaré a la respuesta de @neevek, si obtienes el already exists in the index error, entonces puedes probar esta versión:

  1. Eliminar todos los “repositorios ya clonados” de cache:
    (Porque ya hay un objeto allí que no apunta al repositorio como un submódulo, y primero debe eliminarse del índice para evitar conflictos. El contenido o el índice de sus repositorios no ser borrado al hacer esto)

    git rm --cached ./localrepo
    
  2. Usar git submodule add https//example.com/remoterepo ./localrepodónde ./localrepo es su repositorio git existente.

    • Nota: obtienes la URL para remoterepo de localrepo/.git/config.
  3. Repita el segundo paso para todos sus repositorios existentes que desee agregar como submódulos.
  4. Ahora puedes correr git submodule foreach git pull para actualizar todos sus subproyectos.

Si tiene muchos submódulos, es posible que desee escribir un pequeño script para automatizar el segundo paso.

  • git rm --cached ./localrepo Esto me faltaba en otras respuestas. De lo contrario tengo '<rep>' already exists in the index

    – sintetizador

    23 dic 2019 a las 17:00

¿Ha sido útil esta solución?