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


95

如何将git子模块替换为其他git repo?

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

  • 位于./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.

Answers:


122

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

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

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


4
还值得注意的是:当另一个用户(已经初始化子模块)获取您的更新时,他们还必须做一次“ git submodule sync”,新的子模块才能为他们工作。
joseph.hainline

2
这对我没有用。此后,我的子模块仍指向旧的URL。有什么想法吗?
Arne 2013年

34
@Arne也许您的子模块从未正确初始化。我不得不rm -rf .git/modules/<submodule>在它对我起作用之前。
David Braun 2013年

@DavidBraun我有同样的问题,因为@Arne尽管这样做git submodule syncrm -rf .git/modules/<submodule>fatal: Not a git repository: ../.git/modules/<submodule>。有小费吗?我最初git submodule add https://<submodule-url>根据git docs 创建了子模块...
acannon828

1
之后,我必须cd到模块的目录,git签出我想要的分支,然后git pull。
Nicolas Raoul 2014年

34

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

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

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

所以输入:

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

然后您将在期望的路径加载子模块。


2
尽管这种方法行得通,但它并不比Tim的方法干净。
joseph.hainline 2013年

4
这对我有用,但我也不得不删除.git/modules/<path_to_submodule>
Nate

1
赞赏对的引用--name。我不了解与此有关的问题,在使用该选项之前,我无法替换子模块(感谢您的回答)。
aknuds1 2015年

这是对我唯一有效的方法,但是我想保留相同的目录名。它确实签出了正确的路径,并使模块名称成为所需的名称,但是工作目录名称是新的存储库名称。因此,如果您想使用相同的名称,则还需要在网址末尾指定该名称,例如: git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
rgb

8

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

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

5

解决此问题的方法是在您的git repo的根目录(而不是子模块)中,运行

rm -rf .git/modules/yourmodule

然后,您应该能够正常添加。


3

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

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

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


2

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

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

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

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

不要运行,git submodule sync因为那样会再次重置为默认URL。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.