如何用不同的git repo替换git子模块?
具体来说,我有一个子模块:
./ExternalFrameworks/TestFramework
,指向git repo git@github.com:userA/TestFramework.git
git@github.com:userB/TestFramework.git
。问题在于,当我使用描述here的方法删除子模块时,请使用命令
重新添加子模块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.
答案 0 :(得分:109)
如果子模块的位置(URL)发生了变化,那么您可以简单地:
.gitmodule
文件以使用新网址rm -rf .git/modules/<submodule>
rm -rf <submodule>
git submodule sync
git submodule update
更完整的信息可以在其他地方找到:
答案 1 :(得分:32)
首先,使用已经提到的here方法删除当前子模块,为方便起见,我将其包括在内:
.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 :(得分:6)
这些命令将在命令提示符下完成工作,而不会更改本地存储库中的任何文件。
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
答案 3 :(得分:5)
为我修复此问题的原因是你的git repo(不是子模块)的根目录,运行
rm -rf .git/modules/yourmodule
然后你应该可以正常添加。
答案 4 :(得分:2)
我找到的最简单方法是:
git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]
我不喜欢手动修改.gitmodules
的想法。我还写了关于它的a little blogpost。
答案 5 :(得分:1)
如果您想更改仅适用于此克隆的远程网址 :
git config submodule."$submodule_name".url "$new_url"
这不会影响父项目中的.gitmodules
文件,因此不会传播给其他开发人员。
这被描述为“用户特定记录更改”here。
不要 运行git submodule sync
,因为它会再次重置为默认网址。