108

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

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

  • 位于./ExternalFrameworks/TestFramework那个指向 git repogit@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.
4

6 回答 6

137

如果子模块的位置(URL)发生了变化,那么您可以简单地:

  1. 修改您的.gitmodule文件以使用新的 URL
  2. 删除 repo 中的子模块文件夹rm -rf .git/modules/<submodule>
  3. 删除工作目录下的子模块文件夹rm -rf <submodule>
  4. git submodule sync
  5. git submodule update

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

于 2013-01-18T18:45:13.910 回答
36

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

  • .gitmodules从文件中删除相关部分
  • 删除相关部分.git/config
  • 运行git rm --cached path_to_submodule(没有尾部斜杠)
  • 提交并删除现在未跟踪的子模块文件

现在,添加带有--name标志的新子模块。这将为 git 提供一个备用名称以.git/config供子模块参考,以与历史上存在的子模块消除冲突,您仍希望在以前的历史中工作。

所以输入:

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

你会在你期望的路径上加载子模块。

于 2013-01-18T17:52:39.323 回答
9

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

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
于 2015-06-05T20:28:03.440 回答
5

对我来说解决这个问题的是你的 git repo 的根目录(不是子模块),运行

rm -rf .git/modules/yourmodule

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

于 2015-05-06T17:32:55.980 回答
3

我发现的最简单的方法是:

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

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

于 2014-07-16T13:57:33.783 回答
2

如果您只想更改此克隆的远程 URL :

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

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

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

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

于 2016-10-27T10:15:52.160 回答