¿Cómo deshago el submódulo de un submódulo git (devuelvo todo el código al núcleo)?
Como en "debería" I, como en "Mejor procedimiento" ...
git
git-submodules
Quickredfox
fuente
fuente
git submodule deinit
, vea mi respuesta a continuacióngit submodule deinit asubmodule ; git rm asubmodule
es suficiente, como se ilustra en mi respuesta a continuaciónRespuestas:
Si todo lo que desea es poner su código de submódulo en el repositorio principal, solo necesita eliminar el submódulo y volver a agregar los archivos en el repositorio principal:
Si también desea preservar el historial del submódulo, puede hacer un pequeño truco: "fusionar" el submódulo en el repositorio principal para que el resultado sea el mismo que antes, excepto que los archivos del submódulo ahora están en el repositorio principal.
En el módulo principal, deberá hacer lo siguiente:
El repositorio resultante se verá un poco extraño: habrá más de una confirmación inicial. Pero no causará ningún problema para git.
En esta segunda solución, tendrá la gran ventaja de que aún puede ejecutar git blame o git log en los archivos que originalmente estaban en submódulos. De hecho, lo que hizo aquí fue cambiar el nombre de muchos archivos dentro de un repositorio, y git debería detectarlo automáticamente. Si todavía tiene problemas con el registro de git, pruebe algunas opciones (--follow, -M, -C) que mejoran la detección de cambio de nombre / copia.
fuente
git merge
garantiza que habrá un "compromiso previo" para cada archivo (en uno de los dos "lados" de la fusión).mkdir foo && git mv !(foo) foo && git commit
.--allow-unrelated-histories
para forzar la fusión en la fusión falsa que estaba obteniendofatal: refusing to merge unrelated histories
, más aquí: github.com/git/git/blob/master/Documentation/RelNotes/…Desde git 1.8.5 (noviembre de 2013 ) ( sin mantener el historial del submódulo ):
Esa voluntad:
deinit
ahí elmv
primero ),.gitmodules
para ti (rm
),rm
).Una vez que se completa la eliminación del submódulo (
deinit
ygit rm
), puede cambiar el nombre de la carpeta a su nombre original y agregarlo al repositorio de git como una carpeta normal.Nota: si el submódulo fue creado por un antiguo Git (<1.8), puede que tenga que quitar el anidado
.git
carpeta dentro de la misma sub-módulo, como se ha comentado por Simon MedioSi necesita mantener el historial del submódulo, consulte la respuesta de jsears , que utiliza .
git filter-branch
fuente
deinit
solo limpió el árbol de trabajo de tu submódulo?He creado una secuencia de comandos que traducirá un submódulo a un directorio simple, mientras conserva todo el historial de archivos. No sufre los
git log --follow <file>
problemas que sufren las otras soluciones. También es una invocación de una línea muy fácil que hace todo el trabajo por usted. G'luck.Se basa en el excelente trabajo de Lucas Jenß, descrito en su publicación de blog " Integrando un submódulo en el repositorio principal ", pero automatiza todo el proceso y limpia algunos otros casos de esquina.
El último código se mantendrá con correcciones de errores en github en https://github.com/jeremysears/scripts/blob/master/bin/git-submodule-rewrite , pero en aras del protocolo de respuesta de stackoverflow adecuado, he incluido el solución en su totalidad a continuación.
Uso:
git-submodule-rewrite:
fuente
curl https://raw.githubusercontent.com/jeremysears/scripts/master/bin/git-submodule-rewrite > git-submodule-rewrite.sh
y./git-submodule-rewrite.sh <submodule-name>
git rm --cached the_submodule_path
.gitmodules
archivo, o si es el único submódulo, elimine el archivo.git add the_submodule_path
No encontré ninguna manera más fácil todavía. Puede comprimir 3-5 en un solo paso, por
git commit -a
cuestión de gustos.fuente
.gitmodules
lugar de.submodules
?.gitmodules
no.submodules
.git
directorio del submódulo antes degit add
que funcionara en la carpeta del submóduloMuchas respuestas aquí, pero todas parecen ser demasiado complejas y probablemente no hacen lo que quieres. Estoy seguro de que la mayoría de la gente quiere mantener su historia.
Para este ejemplo, el repositorio principal será
[email protected]:main/main.git
y el repositorio de submódulo será[email protected]:main/child.git
. Esto supone que el submódulo está ubicado en el directorio raíz del repositorio principal. Ajuste las instrucciones según sea necesario.Comience clonando el repositorio principal y eliminando el submódulo anterior.
Ahora agregaremos los repositorios secundarios aguas arriba al repositorio principal.
El siguiente paso supone que desea mover los archivos de la rama merge-prep a la misma ubicación que el submódulo anterior, aunque puede cambiar fácilmente la ubicación cambiando la ruta del archivo.
mueve todas las carpetas y archivos excepto la carpeta .git a la carpeta secundaria.
Ahora puede simplemente fusionar sus archivos nuevamente en la rama maestra.
Mire a su alrededor y asegúrese de que todo se vea bien antes de correr
git push
Lo único que debe recordar ahora es que git log no sigue de forma predeterminada los archivos movidos; sin embargo, al ejecutarlos
git log --follow filename
puede ver el historial completo de sus archivos.fuente
git merge merge-prep
y recibí el errorfatal: refusing to merge unrelated histories
. Solución alternativa es la siguiente:git merge --allow-unrelated-histories merge-prep
.child
directorio, para que no tenga que moverlos más tarde? Tengo los mismos nombres de archivo en un submódulo y el repositorio principal ... así que solo aparece un conflicto de fusión ya que está tratando de fusionar los dos archivos juntos.Nos sucedió que creamos 2 repositorios para 2 proyectos que estaban tan acoplados que no tenía sentido separarlos, por lo que los fusionamos.
Primero mostraré cómo fusionar las ramas maestras en cada una y luego explicaré cómo puede extender esto a todas las ramas que tenga, espero que le sirva de ayuda.
Si tiene el submódulo funcionando y desea convertirlo a un directorio en su lugar, puede hacer lo siguiente:
Aquí hacemos un clon limpio para trabajar. Para este proceso no necesita inicializar o actualizar los submódulos, así que simplemente omítalo.
Edite
.gitmodules
con su editor favorito (o Vim) para eliminar el submódulo que planea reemplazar. Las líneas que necesita eliminar deberían verse así:Después de guardar el archivo,
Aquí eliminamos la relación de submódulo por completo para que podamos crear el otro repositorio al proyecto en el lugar.
Aquí buscamos el repositorio de submódulos para fusionar.
Aquí comenzamos una operación de fusión de los 2 repositorios, pero nos detenemos antes de confirmar.
Aquí enviamos el contenido de master en el submódulo al directorio donde estaba antes de prefijar un nombre de directorio
Aquí completamos el procedimiento haciendo un commit de los cambios en la fusión.
Después de terminar esto, puede presionar y comenzar de nuevo con cualquier otra rama para fusionar, solo revise la rama en su repositorio que recibirá los cambios y cambie la rama que trae en las operaciones de fusión y árbol de lectura.
fuente
directory_of_submodule
git log original_path_of_file_in_submodule
es decir, la ruta registrada en el repositorio de git para el archivo (que ya no existe en el sistema de archivos) a pesar de que el archivo de submódulo ahora vive ensubmodule_path/new_path_of_file
La mejor respuesta a esto que he encontrado está aquí:
http://x3ro.de/2013/09/01/Integrating-a-submodule-into-the-parent-repository.html
Este artículo explica muy bien el procedimiento.
fuente
Aquí hay una versión ligeramente mejorada (en mi humilde opinión) de la respuesta de @ gyim. Está haciendo un montón de cambios peligrosos en la copia de trabajo principal, donde creo que es mucho más fácil operar en clones separados y luego fusionarlos al final.
En un directorio separado (para hacer que los errores sean más fáciles de limpiar e intentar nuevamente), consulte tanto el repositorio superior como el subrepo.
Primero edite el subrepo para mover todos los archivos al subdirectorio deseado
Tome nota de la CABEZA
Ahora elimine el subrepo del repositorio principal
Y finalmente, solo fusionarlos
¡Y hecho! Con seguridad y sin ningún tipo de magia.
fuente
subrepo
con cosas en él?git merge $SUBREPO_HEAD fatal: refusing to merge unrelated histories
¿Debo usargit merge $SUBREPO_HEAD --allow-unrelated-histories
en este caso? ¿O debería funcionar sin y cometí un error?Para cuando
devoluciones
Contexto: lo hice
rm -r .git*
en mis carpetas de submódulos antes de darme cuenta de que necesitaban ser sub-modulados en el proyecto principal al que los acababa de agregar. Obtuve el error anterior al desmodular algunos, pero no todos. De todos modos, los arreglé corriendo (después, por supuesto, elrm -r .git*
)Tenga en cuenta que esto no preserva la historia.
fuente
Basado en la respuesta de VonC , he creado un script bash simple que hace esto. Al
add
final tiene que usar comodines; de lo contrario, deshacerá el anteriorrm
para el submódulo mismo. Es importante agregar el contenido del directorio de submódulos y no nombrar el directorio en síadd
comando.En un archivo llamado
git-integrate-submodule
:fuente
Me pareció más conveniente (¿también?) Recuperar datos de confirmación local del submódulo, porque de lo contrario los perdería. (No pude empujarlos ya que no tengo acceso a ese control remoto). Así que agregué submodule / .git como remote_origin2, busqué commits y me fusioné desde esa rama. No estoy seguro si todavía necesito el submódulo remoto como origen, ya que todavía no estoy lo suficientemente familiarizado con git.
fuente
Esto es lo que encontré mejor y más simple.
En el repositorio de submódulos, desde HEAD desea fusionarse con el repositorio principal:
git checkout -b "mergeMe"
mkdir "foo/bar/myLib/"
(ruta idéntica a donde desea los archivos en el repositorio principal)git mv * "foo/bar/myLib/"
(mover todo al camino)git commit -m "ready to merge into main"
De vuelta en el repositorio principal después de eliminar el submódulo y borrar la ruta "foo / bar / myLib":
git merge --allow-unrelated-histories SubmoduleOriginRemote/mergeMe
boom hecho
historias preservadas
sin preocupaciones
Tenga en cuenta esto casi idéntico a algunas otras respuestas. Pero esto supone que tienes un repositorio de submódulos. Además, esto facilita obtener futuros cambios ascendentes para el submódulo.
fuente