167 votos

un-submódulo un submódulo git

¿Cómo hago un-submódulo un submódulo git (traer todo el código de nuevo en el núcleo)?

Al igual que en la forma "debería" Yo, al igual que en "El mejor procedimiento" ...

252voto

gyim Puntos 3103

Si lo que quieres es poner tu submódulo código en el repositorio principal, sólo necesita quitar el submódulo y volver a agregar los archivos a la principal de la repo:

git rm --cached submodule_path # delete reference to submodule HEAD (no trailing slash)
git rm .gitmodules             # if you have more than one submodules,
                               # you need to edit this file instead of deleting!
rm -rf submodule_path/.git     # make sure you have backup!!
git add submodule_path         # will add files instead of commit reference
git commit -m "remove submodule"

Si usted también quiere preservar la historia de la submódulo, usted puede hacer un pequeño truco: "fusionar" el submódulo en el repositorio principal de manera que el resultado será el mismo que era antes, excepto que el submódulo de archivos están ahora en el repositorio principal.

En el módulo principal, necesitará hacer lo siguiente:

# Fetch the submodule commits into the main repository
git remote add submodule_origin git://url/to/submodule/origin
git fetch submodule_origin

# Start a fake merge (won't change any files, won't commit anything)
git merge -s ours --no-commit submodule_origin/master

# Do the same as in the first solution
git rm --cached submodule_path # delete reference to submodule HEAD
git rm .gitmodules             # if you have more than one submodules,
                               # you need to edit this file instead of deleting!
rm -rf submodule_path/.git     # make sure you have backup!!
git add submodule_path         # will add files instead of commit reference

# Commit and cleanup
git commit -m "removed submodule"
git remote rm submodule_origin

El resultado repositorio se vea un poco raro: no será más que un primer commit. Pero esto no causa ningún problema para git.

En esta segunda solución que usted tendrá la gran ventaja de que usted puede ejecutar git culpa o git log en los archivos que estaban originalmente en submódulos. En realidad lo que hicimos aquí es cambiar el nombre de muchos archivos en un repositorio git y debe detectará. Si usted todavía tiene problemas con git log, pruebe algunas de las opciones (--sigue, -M, -C), que hacerlo mejor cambiar el nombre/copia de detección.

30voto

VonC Puntos 414372

Ahora debería ser más fácil que la anterior respuesta, con que comando nuevo (git1.8.3, abril 22d 2013):

git submodule deinit

Consulte "¿Cómo puedo quitar un Git submódulo?"

Le van a quitar el submódulo de la .git/config archivo y desde .git/modules/xxx, y descargar el submódulo:

Anular el dado submódulos, es decir. eliminar la totalidad submodule.$name sección de .git/config junto con su trabajo de árbol.

Pero no de la .gitmodules archivo, y no desde el índice.

CharlesB puntos (en los comentarios) para que "se Puede hacer una "copia en profundidad" de un repositorio git con submódulos?":

git config --remove-section submodule.name

Que sería similar a git submodule deinit, sin que la descarga de los submódulo de el árbol de trabajo.

git 1.8.5 pronto permitirá: git rm yourSubmodule cuidar de que el resto (.gitmodules de entrada y el índice especiales de entrada).
En el que:

  • limpiar la .gitmodules para usted,
  • y eliminar la entrada especial que representa que submódulo SHA1 en el índice de los padres de repos.

Que significa realmente unsubmodule un submódulo, que va a hacer (git 1.8.5 o 1.9, Q4 2013)

git submodule deinit yourSubmodule
git rm --cached yourSubmodule

De esa manera, mantener el código en tu directorio de trabajo (debido a la --cached opción de git rm), pero el 'yourSubmodule' carpeta ya no es un submódulo.

12voto

dvicino Puntos 585

Lo que nos pasó a nosotros que hemos creado 2 repositorios para 2 proyectos que eran tan junto que no tenía ningún sentido para tenerlos separados, así que nos unimos a ellos.

Te voy a mostrar cómo combinar el maestro de las ramas en cada uno de los primeros y, a continuación, voy a explicar cómo se puede extender a todas las ramas que tienes, espero que te ayuda.

Si tienes el submódulo de trabajo, y quieres convertirlo en un directorio en el lugar que usted puede hacer:

git clone project_uri project_name

Aquí vamos a hacer una limpia clon del trabajo. Para este proceso no es necesario inicializar o actualización de los submódulos, así que acaba de saltar.

cd project_name
vim .gitmodules

Editar .gitmodules con su editor favorito (o Vim) para quitar el submódulo se planea reemplazar. Las líneas que usted necesita para eliminar debería ser algo como esto:

[submodule "lib/asi-http-request"]
    path = lib/asi-http-request
    url = https://github.com/pokeb/asi-http-request.git

Después de guardar el archivo,

git rm --cached directory_of_submodule
git commit -am "Removed submodule_name as submodule"
rm -rf directory_of_submodule

Aquí nos quite el submódulo relación completamente, de manera que podemos crear traer el otro repositorio para el proyecto en el lugar.

git remote add -f submodule_origin submodule_uri
git fetch submodel_origin/master

Aquí lo podemos recuperar el submódulo repositorio de combinar.

git merge -s ours --no-commit submodule_origin/master

Aquí se inicia una operación de combinación de los 2 a los repositorios, pero pare antes de comprometerse.

git read-tree --prefix=directory_of_submodule/ -u submodule_origin/master

Aquí podemos enviar el contenido de maestro en el submódulo al directorio donde estaba antes el prefijo de un nombre de directorio

git commit -am "submodule_name is now part of main project"

Aquí se completa el procedimiento de hacer un commit de los cambios en la mezcla.

Después de terminar este puede empujar, y empezar de nuevo con cualquier otra rama de fusionar, solo checkout de la rama en que repositorio en el que se recibirán los cambios y el cambio de la rama en la que poner en la mezcla y leer-árbol de operaciones.

6voto

Marcel Jackwerth Puntos 20632
  1. git rm --cached the_submodule_path
  2. quite la sección submódulo del .submodules archivo
  3. Por qué un commit "xyz submódulo eliminado"
  4. git add the_submodule_path
  5. otro commit "código base de xyz añadido"

No he encontrado ninguna manera más fácil todavía. Puede comprimir 3-5 en un paso a través de git commit -a - cuestión de gusto.

1voto

brandones Puntos 103

Para cuando

 git rm [-r] --cached submodule_path
 

devoluciones

 fatal: pathspec 'emr/normalizers/' did not match any files
 

Contexto: Hice rm -r .git* en mis carpetas submódulo antes de darse cuenta de que tenían que ser submoduled-des en el proyecto principal a la que sólo les había añadido. Tengo el error anterior-submoduling des cuando algunos, pero no todos ellos. De todos modos, yo les arreglé ejecutando, (después, por supuesto, el rm -r .git* )

 mv submodule_path submodule_path.temp
git add -A .
git commit -m "De-submodulization phase 1/2"
mv submodule_path.temp submodule_path
git add -A .
git commit -m "De-submodulization phase 2/2"
 

Tenga en cuenta que este no conserva la historia.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X