更改git子模块的远程存储库

我创build了一个子模块的Git仓库。 我能够告诉子模块本身来改变它的远程存储path,但我不知道如何告诉父库如何改变子模块的远程存储path。

我不会感到惊讶,如果我有点运气不好,不得不手动去做,甚至删除子模块也不容易。

你应该能够编辑.gitmodules文件来更新URL,然后运行git submodule sync来反映对超级项目和你的工作拷贝的改变。

这些命令将在命令提示符下执行,而不会更改本地存储库上的任何文件

 git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git git config --file=.gitmodules submodule.Submod.branch Development git submodule sync git submodule update --init --recursive --remote 

请查看截图的博客: 将GIT子模块URL / Branch更改为同一存储库的其他URL /分支

实际上, 2009年4月已经提交了一个补丁来澄清gitmodule作用。

所以现在gitmodule文档还不包括:

位于git工作树的顶层目录中的.gitmodules文件是一个文本文件,其语法与要求-of linkgit:git-config 1相匹配。
[新]:
由于这个文件是由Gitpipe理的,它跟踪项目子模块的+logging。
存储在这个文件中的信息被用作提示存储在项目configuration文件中的权威版本logging的提示。
应该对configuration文件进行用户特定的logging更改(例如为了解决由于networking情况而导致的子模块URL的差异), 同时logging要传播的logging(例如+由于子模块源的重新定位) 。

这几乎证实了吉姆的答案 。


如果你遵循这个git子模块教程 ,你会发现你需要一个“ git submodule init ”来将子模块库URL添加到.git / config。

“ 2008年8月增加了 ” git submodule sync “,这正是为了在URL更改(尤其是子模块的数量很重要)时更容易。
与该命令相关的脚本非常简单:

 module_list "$@" | while read mode sha1 stage path do name=$(module_name "$path") url=$(git config -f .gitmodules --get submodule."$name".url) if test -e "$path"/.git then ( unset GIT_DIR cd "$path" remote=$(get_default_remote) say "Synchronizing submodule url for '$name'" git config remote."$remote".url "$url" ) fi done 

目标依然是: git config remote."$remote".url "$url"

什么工作对我来说(在Windows上,使用git版本1.8.3.msysgit.0):

  • 使用新存储库的path更新.gitmodules
  • 从“.git / config”文件中删除相应的行
  • 删除“.git / modules / external”目录中的相应目录
  • 删除检出的子模块目录本身(不确定是否有必要)
  • 运行git submodule initgit submodule update
  • 确保签出的子模块是在正确的提交,并提交,因为它很可能会有所不同

做完这一切后,一切都处于我期望的状态。 我想这个版本库的其他用户在更新时也会有类似的痛苦 – 在你的提交信息中解释这些步骤是明智的!

简单来说,你只需要编辑.gitmodules文件,然后重新同步和更新:

编辑文件,可以通过git命令或直接:

 git config --file=.gitmodules -e 

要不就:

 vim .gitmodules 

然后重新同步和更新:

 git submodule sync git submodule update --init --recursive --remote 

只需编辑你的.git / config文件。 例如; 如果你有一个“通用”子模块,你可以在超级模块中做到这一点:

 git config submodule.common.url /data/my_local_common 

git config --file=.gitmodules -e打开默认编辑器,您可以在其中更新path