如何用另一个回购替换 git 子模块?

如何用不同的 git 回购替换 git 子模块?

具体来说,我有一个子模块:

  • 位于 ./ExternalFrameworks/TestFramework指向一个 git 回购 git@github.com:userA/TestFramework.git
  • 我希望它现在指向 git@github.com:userB/TestFramework.git

问题是,当我使用所描述的 给你方法删除子模块时,然后使用下面的命令重新添加它

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

我得到了这个错误:

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.
48549 次浏览

First, delete the current submodule with the method already mentioned here, which I'm including for convenience:

  • Delete the relevant section from the .gitmodules file
  • Delete the relevant section from .git/config
  • Run git rm --cached path_to_submodule (no trailing slash)
  • Commit and delete the now untracked submodule files

Now, add the new submodule with the --name flag. This will give git an alternate name to reference in .git/config for the submodule, to deconflict with the submodule that was there historically, which you still want to work in your prior history.

So type:

git submodule add --name UpdatedTestFramework git@github.com:userB/TestFramework.git

and you'll get the submodule loaded at the path you expect.

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:

The easiest way that I found is this:

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

I didn't like the idea to modify my .gitmodules manually. I also wrote a little blogpost about it.

What fixed this for me was in the root of your git repo (not the submodule), run

rm -rf .git/modules/yourmodule

Then you should be able to add as normal.

These commands will do the work on command prompt without altering any files on local repository.

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

If you want to change the remote URL only for this clone:

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

This won't affect the .gitmodules file in the parent project, so it won't be propagated to other developers.

This is described as "user specific record changes" here.

Do not run git submodule sync as that will reset to the default URL again.