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

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

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

  • 的位置在git@github.com:userB/TestFramework.git,表示git repo 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.
joseph.hainline asked 2019-09-11T04:08:29Z
6个解决方案
109 votes

如果子模块的位置(URL)已更改,那么您可以简单地:

  1. 修改您的git submodule update文件以使用新的URL
  2. rm -rf .git / modules /
  3. rm -rf
  4. 运行git submodule update
  5. 运行git submodule update

更完整的信息可以在其他地方找到:

  • 更改git子模块的远程存储库
  • 如何更改git子模块URL
Tim Henigan answered 2019-09-11T04:09:33Z
32 votes

首先,使用此处已提到的方法删除当前子模块,为方便起见,我将其包括在内:

  • --name文件中删除相关部分
  • --name删除相关部分
  • 运行--name(无尾部斜杠)
  • 提交并删除现在未跟踪的子模块文件

现在,添加带有--name标志的新子模块。 这将为git提供一个替代名称,以便在.git/config中为子模块引用,以消除历史上存在的子模块,您仍希望在之前的历史记录中使用该子模块。

所以输入:

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

并且你将在你期望的路径上加载子模块。

joseph.hainline answered 2019-09-11T04:10:44Z
6 votes

这些命令将在命令提示符下完成工作,而不会更改本地存储库上的任何文件。

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 answered 2019-09-11T04:11:09Z
5 votes

为我修复此问题的原因是你的git repo(不是子模块)的根目录,运行

rm -rf .git/modules/yourmodule

然后你应该能够正常添加。

hobberwickey answered 2019-09-11T04:11:40Z
2 votes

我发现最简单的方法是:

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

我不喜欢手动修改我的.gitmodules的想法。 我还写了一篇关于它的博文。

DerZyklop answered 2019-09-11T04:12:11Z
1 votes

如果要仅为此克隆更改远程URL:

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

这不会影响父项目中的git submodule sync文件,因此不会传播给其他开发人员。

这在此处被描述为“用户特定记录更改”。

不要运行git submodule sync,因为它将再次重置为默认URL。

joeytwiddle answered 2019-09-11T04:12:56Z
translate from https://stackoverflow.com:/questions/14404704/how-do-i-replace-a-git-submodule-with-another-repo