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

时间:2009-05-27 02:35:50

标签: git git-submodules

我已经创建了一个带有子模块的git存储库。我能够告诉子模块本身更改其远程存储库路径,但我不知道如何告诉父存储库如何更改子模块的远程存储库路径。

如果我运气不好并且必须手动操作,我不会感到惊讶,因为即使删除子模块也不容易。

7 个答案:

答案 0 :(得分:876)

您应该只能编辑.gitmodules文件以更新网址,然后运行git submodule sync以反映对超级项目和工作副本的更改。

答案 1 :(得分:119)

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

 @media handheld and (min-width: 20em), screen and (min-width: 20em) { … }

请查看博客中的屏幕截图:Changing GIT submodules URL/Branch to other URL/branch of same repository

答案 2 :(得分:64)

对我有用(在Windows上,使用git版本1.8.3.msysgit.0):

  • 使用新存储库的路径更新.gitmodules
  • 从“.git / config”文件中删除相应的行
  • 删除“.git / modules / external”目录中的相应目录
  • 删除已签出的子模块目录(不确定是否有必要)
  • 运行git submodule initgit submodule update
  • 确保签出的子模块处于正确的提交状态,然后提交,因为哈希可能会有所不同

完成所有这些之后,一切都处于我期望的状态。我认为存储库的其他用户在更新时会有类似的痛苦 - 在提交消息中解释这些步骤是明智的!

答案 3 :(得分:57)

实际上是一个补丁has been submitted in April 2009来澄清gitmodule角色。

所以现在gitmodule documentation还没有包括:

  

位于git工作树顶级目录中的.gitmodules文件是一个文本文件,其语法与linkgit:git-config 1的要求相匹配。
  [新]:
  由于此文件由Git管理,它会跟踪项目子模块的+记录   存储在此文件中的信息用作提示,以填充存储在项目配置文件中的记录的权威版本   应该对配置文件进行用户特定记录更改(例如,考虑到由于网络情况导致的子模块URL的差异),同时应该传播要传播的记录更改(例如,由于子模块源的重定位而导致的+)到这个文件。

这几乎证实了Jim's answer


如果您遵循此git submodule tutorial,您会发现需要“git submodule init”才能将子模块存储库URL添加到.git / config。

git submodule sync”具有been added in August 2008,以便在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"

答案 4 :(得分:9)

只需编辑 .git / config 文件即可。例如;如果您有一个“common”子模块,您可以在超级模块中执行此操作:

git config submodule.common.url /data/my_local_common

答案 5 :(得分:3)

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

答案 6 :(得分:0)

暴力手段:

  • 更新超级模块中的.gitmodules文件以指向新的子模块url,
  • 将更改添加并提交到supermodule/.gitmodules
  • 在计算机上的其他位置创建超级模块的新克隆(确保对.gitmodules文件的最新更改反映在克隆中)
  • 将工作目录更改为超级模块的新克隆,
  • 在子模块上运行git submodule update --init path-to-submodule

等等!超级模块的新克隆中的子模块已正确配置!