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?
neevek
Agregar un repositorio git existente como un submódulo es lo mismo que agregar uno nuevo.
- Primero haga que la carpeta que contiene todos sus repositorios de git sea un repositorio de git con
git init
. - Usar
git submodule add https//example.com/remoterepo ./localrepo
dónde./localrepo
es su repositorio git existente.- Nota: obtienes la URL para
remoterepo
delocalrepo/.git/config
.
- Nota: obtienes la URL para
- Repita el segundo paso para todos sus repositorios existentes que desee agregar como submódulos.
- 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_A
solo 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
ypopd
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 usandofor 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:
-
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
-
Usar
git submodule add https//example.com/remoterepo ./localrepo
dónde./localrepo
es su repositorio git existente.- Nota: obtienes la URL para
remoterepo
delocalrepo/.git/config
.
- Nota: obtienes la URL para
- Repita el segundo paso para todos sus repositorios existentes que desee agregar como submódulos.
- 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