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

And*_*imm 667 git git-submodules

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

如果我有点不幸并且必须手动操作,我不会感到惊讶,因为即使删除子模块也不容易.

Jim*_*uls 942

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

  • 使用`git submodule foreach -q git config remote.origin.url`查看"实际"子模块网址 (55认同)
  • 这似乎不会更新.git/config,至少在1.7.1或1.7.3中. (20认同)
  • 它为我更新了`.git/config`,我有git 1.7.5.4. (9认同)
  • 这会更新以前提交的子模块url配置吗?例如,如果我签出旧的提交,它会指向新的子模块网址吗? (6认同)
  • 它没有使用git 2.1.0为我更新`.git/config`.在运行`git submodule sync --recursive`之前,我必须手动更新`.gitmodules`和`.git/config`以更新我的子模块远程. (6认同)
  • 这似乎缺少`git submodule update --init --recursive --remote`的关键步骤,该步骤实际上将存储库更改为新的远程 (2认同)
  • 由于这是得票最高的答案,因此可能应该更新;请参阅[此答案](/sf/answers/63989481/) (2认同)

Pav*_*raj 137

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • 这工作但我必须记住将更改推送到遥控器.`git add .gitmodules``git commit -m"modified submodule URL"``git push origin master` (6认同)
  • 嗯,这对我造成了可怕的混乱.命令安静地下降,但实际的子模块库仍然认为它的远程是旧的(旧的URL).也许这些命令应该伴随子模块库中的其他命令? (4认同)
  • 最后一个命令有点极端......如果你的子模块里面有子模块,这将远程更新子子模块,这不太可能你需要的. (4认同)
  • 请注意,您需要将Submod替换为您的子模块的名称! (4认同)

Mat*_*son 110

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

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

git config --file=.gitmodules -e
Run Code Online (Sandbox Code Playgroud)

要不就:

vim .gitmodules
Run Code Online (Sandbox Code Playgroud)

然后重新同步和更新:

git submodule sync
git submodule update --init --recursive --remote
Run Code Online (Sandbox Code Playgroud)

  • git submodule update --init对我有用,`--remote似乎将它绑定到远程仓库的HEAD上。 (4认同)

Ben*_*ers 67

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

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

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

  • 非常感谢你做的这些.在我运行了`git submodule update`之后,这是唯一一个适合我的方法.其他答案之后不会改变`./ git/modules/external`目录中的内容,因此尝试更新会导致它仍然拉不正确的URL. (2认同)
  • 按照以下步骤操作,发现“删除签出的子模块目录本身(不确定是否有必要)”是必要的,否则在运行 git submodule update 时您将遇到“致命:不是 git 存储库:...” (2认同)

Von*_*onC 65

实际上,2009年4月已提交补丁以澄清gitmodule角色.

所以现在gitmodule文档还没有包括:

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

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


如果你按照这个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
Run Code Online (Sandbox Code Playgroud)

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

  • `git submodule set-url [--] <path> <newurl>` 中可选的双破折号有什么作用? (2认同)
  • @jeverling它们有助于将选项与参数分开:请参阅/sf/answers/83453611/ (2认同)

Fel*_*peC 9

只需编辑.git/config文件即可.例如; 如果你有一个"通用"子模块,你可以在超级模块中执行此操作:

git config submodule.common.url /data/my_local_common
Run Code Online (Sandbox Code Playgroud)