如何在本地更改git子模块url?

时间:2017-02-03 16:11:54

标签: git git-submodules

原始.gitmodules文件使用硬编码的https网址,但对于某些自动化测试,我会从ssh克隆,并使子模块网址与../ModuleName相对。我也不想将这些变化推回到回购中。

# change the https://github.com/ with git@github.com:
sed -i 's/https:\/\/github.com\//git@github.com:/g' ".git/config"
# delete the url lines from the submodule blocks of .git/config
sed -i '/submodule/ {$!N;d;}' ".git/config"
# change hardcoded https:// urls of submodules to relative ones
sed -i 's/https:\/\/github.com\/ProjName/../g' ".gitmodules"
# also make the same change in the .git/modules/*/config
sed -i 's/https:\/\/github.com\/ProjName/../g' .git/modules/*/config
# sync and update
git submodule sync
git submodule update --init --recursive --remote

使用上面的代码段,它可以实现我想要的效果。然而,令人讨厌的是,.git/modules/文件夹似乎没有受版本控制,但如果我删除它,git submodule sync和大多数其他Git操作就会停止工作。

修改.git/modules.gitmodules文件后,有没有办法让.git/config重新生成?

3 个答案:

答案 0 :(得分:16)

如果您只想修改用于本地仓库的子模块的URL,请不要修改.gitmodules文件,该文件仅适用于您要推送的更改。

相反,首先初始化本地子模块配置:

git submodule init

然后修改.git/config文件以照常更改子模块URL。 (同样,这里不需要修改.gitmodules,如果这是一个新的克隆,你可能还没有.git/modules。)

作为@jthill points out,修改子模块URL的更简单方法是:

git config submodule.moduleName.url ssh://user@server/path

此时您想要运行git submodule sync,因为这会覆盖您刚刚使用.gitmodules文件中的值所做的更改。相反,直接去:

git submodule update --recursive --remote

答案 1 :(得分:0)

我尝试了上述解决方案,但出于某种原因出现了一堆问题。以下是另一种选择。

在新的存储库中:

  1. git submodule init
  2. 使用git clone ../local/path/to/submodule.git path/in/repo/submodule
  3. 手动初始化每个子模块

    每当根存储库子模块哈希发生变化并且您需要同步子模块时:

    1. 更新根存储库
    2. git submodule update可能--force--recursive以获得良好衡量标准

答案 2 :(得分:0)

不仅可以使用git config submodule.moduleName.url更改子模块URL,还可以使用Git 2.22(2019年第二季度)更改子模块URL,也可以取消设置:

请参见commit b57e811commit c89c494commit 7a4bb55(2019年2月8日)和Denton Liu (Denton-L)(2019年2月7日)。
(由Junio C Hamano -- gitster --commit 01f8d78中合并,2019年4月25日)

  

submodule--helper:教config子命令--unset

     

这可教子模块-帮助程序配置--unset选项,该选项将删除   .gitmodule文件中指定的配置密钥。

也就是说:

git submodule--helper config --unset submodule.submodule.url &&
git submodule--helper config submodule.submodule.url >actual &&
test_must_be_empty actual