Search code examples
gitgit-submodules

How do I replace a git submodule with another repo?


How do I replace a git submodule with a different git repo?

Specifically, I have a submodule:

  • located at ./ExternalFrameworks/TestFramework that points to a git repo git@github.com:userA/TestFramework.git
  • I'd like it to now point to git@github.com:userB/TestFramework.git.

The problem is that when I delete the submodule with the method described here, then re-add it using the command

git submodule add git@github.com:userB/TestFramework.git

I get this error:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com: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.

Solution

  • If the location (URL) of the submodule has changed, then you can simply:

    1. Modify the .gitmodules file in the repo root to use the new URL.
    2. Delete the submodule folder in the repo rm -rf .git/modules/<submodule>.
    3. Delete the submodule folder in the working directory rm -rf <submodule>.
    4. Run git submodule sync.
    5. Run git submodule update.

    More complete info can be found elsewhere: