¿Cómo reemplazo un submódulo de git con otro repositorio?

95

¿Cómo reemplazo un submódulo de git con un repositorio de git diferente?

Específicamente, tengo un submódulo:

  • ubicado en ./ExternalFrameworks/TestFrameworkeso apunta a un repositorio de git[email protected]:userA/TestFramework.git
  • Me gustaría que ahora apunte [email protected]:userB/TestFramework.git.

El problema es que cuando elimino el submódulo con el método descrito aquí , lo vuelvo a agregar usando el comando

git submodule add [email protected]:userB/TestFramework.git

Me sale este error:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    [email protected]:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  [email protected]:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.
joseph.hainline
fuente
1
posible duplicado de Cambio de repositorio remoto para un submódulo de git
jiyinyiyong

Respuestas:

122

Si la ubicación (URL) del submódulo ha cambiado, simplemente puede:

  1. Modifica tu .gitmodulearchivo para usar la nueva URL
  2. Eliminar la carpeta del submódulo en el repositorio rm -rf .git/modules/<submodule>
  3. Eliminar la carpeta del submódulo en el directorio de trabajo rm -rf <submodule>
  4. correr git submodule sync
  5. correr git submodule update

Se puede encontrar información más completa en otro lugar:

Tim Henigan
fuente
4
También vale la pena señalar: cuando otro usuario (que ya había iniciado el submódulo) recibe su actualización, también tendrá que hacer la "sincronización del submódulo git" una vez antes de que el nuevo submódulo funcione para ellos.
joseph.hainline
2
Esto no funcionó para mí. Mi submódulo todavía apuntaba a la antigua URL después de esto. ¿Alguna idea de por qué?
Arne
34
@Arne Quizás su submódulo nunca se inicializó correctamente. Tenía que hacerlo rm -rf .git/modules/<submodule>antes de que funcionara para mí.
David Braun
@DavidBraun Tengo el mismo problema que @Arne aunque lo hago git submodule syncdespués de rm -rf .git/modules/<submodule>dar fatal: Not a git repository: ../.git/modules/<submodule>. ¿Algun consejo? Inicialmente creé el submódulo a través de git submodule add https://<submodule-url>los documentos de git ...
acannon828
1
Luego tuve que ir al directorio del módulo, git checkout la rama que quiero, luego git pull.
Nicolas Raoul
34

Primero, elimine el submódulo actual con el método ya mencionado aquí , que incluyo por conveniencia:

  • Eliminar la sección relevante del .gitmodulesarchivo
  • Eliminar la sección relevante de .git/config
  • Ejecutar git rm --cached path_to_submodule(sin barra al final)
  • Confirme y elimine los archivos de submódulo ahora sin seguimiento

Ahora, agregue el nuevo submódulo con la --namebandera. Esto le dará a git un nombre alternativo para hacer referencia .git/configal submódulo, para desconfigurar con el submódulo que estuvo allí históricamente, que aún desea trabajar en su historial anterior.

Así que escribe:

git submodule add --name UpdatedTestFramework [email protected]:userB/TestFramework.git

y obtendrá el submódulo cargado en la ruta que espera.

joseph.hainline
fuente
2
Si bien esta forma funciona, no es tan limpia como el método de Tim.
joseph.hainline
4
Esto funcionó para mí, pero también tuve que eliminarlo .git/modules/<path_to_submodule>.
Nate
1
Aprecio la referencia a --name. No estaba al tanto de los problemas relacionados con esto y no pude reemplazar un submódulo hasta que hice uso de esta opción (gracias a su respuesta).
aknuds1
Esto terminó siendo el único método que funcionó para mí, sin embargo, quería mantener el mismo nombre de directorio. Verificó la ruta correcta y convirtió el nombre del módulo en el nombre deseado, pero el nombre del directorio de trabajo era el nuevo nombre del repositorio. Entonces, si desea el mismo nombre, también debe especificarlo al final de la URL de la siguiente manera: git submodule add --name old-name-to-keep [email protected]:userB/new-repository.git old-name-to-keep
rgb
8

Estos comandos harán el trabajo en el símbolo del sistema sin alterar ningún archivo en el repositorio local.

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git
git config --file=.gitmodules submodule.Submod.branch Dev
git submodule sync
git submodule update --init --recursive --remote
Pavan Sokke Nagaraj
fuente
5

Lo que solucionó esto para mí fue en la raíz de su repositorio git (no en el submódulo), ejecute

rm -rf .git/modules/yourmodule

Entonces debería poder agregar normalmente.

hobberwickey
fuente
3

La forma más fácil que encontré es esta:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

No me gustó la idea de modificar .gitmodulesmanualmente mi . También escribí una pequeña entrada de blog al respecto.

DerZyklop
fuente
2

Si desea cambiar la URL remota solo para este clon :

git config submodule."$submodule_name".url "$new_url"

Esto no afectará al .gitmodulesarchivo del proyecto principal, por lo que no se propagará a otros desarrolladores.

Esto se describe como "cambios de registro específico del usuario" aquí .

No lo ejecute,git submodule syncya que se restablecerá a la URL predeterminada nuevamente.

joeytwiddle
fuente