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



原始.gitmodules文件使用硬编码的httpsURL,但对于某些自动测试,我从ssh克隆并使子模块URL相对,如../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操作就会停止工作。

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

如果您想修改仅用于本地repo的子模块的URL,那么不要修改.gitmodules文件,这仅用于您想要推送的更改。

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

git submodule init

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

正如@jthill所指出的,修改子模块URL的一种更简单的方法是:

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

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

git submodule update --recursive --remote

不仅可以使用git config submodule.moduleName.url更改子模块URL,还可以:

  • 使用Git 2.25(2020年第一季度),您可以修改
    请参阅"Git子模块url已更改"和新命令git submodule set-url [--] <path> <newurl>

  • 使用Git 2.22(2019年第二季度),您还可以取消设置it:

请参阅Denton Liu(Denton-L)的提交b57e811、提交c89c494(2019年2月8日)和提交7a4bb55(2019年4月7日)
(由Junio C Hamano合并——gitster——于2019年4月25日提交01f8d78)

submodule--helper:教学配置子命令--unset

这将教给submodule--helper config--unset选项CCD_ 24文件中指定的配置密钥。

即:

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

使用Git 2.27(2020年第二季度),C中"git submodule"的各个部分的重写仍在继续,包括set-url

参见Shourya Shukla提交的6417cf9(2020年5月8日)(periperidip)
(由Junio C Hamano合并——gitster——于2020年5月13日提交9e8ed17)

submodule:port子命令"set url"从shell到C

签字人:Shourya Shukla

将子模块子命令"set url"转换为内置命令。端口"set-url"到"submodule--helper.c",并通过"git submodule.sh"调用后者。

我相信这种方法比公认的答案更有优势

$ git submodule set-url moduleName ssh://user@server/path
$ git restore .gitmodules  # or: git reset HEAD .gitmodules

这将更改所有位置的URL,然后在不想更改的位置将其设置回以前的值(.gitmodules)。

为什么这比公认的答案要好:当使用git config submodule.moduleName.url设置URL时,用于将此更改传播到实际子模块签出的命令是git submodule update --remote。然而,更新URL只是该命令的副作用,它的主要用途是(潜在地)在子模块中检查出不同的提交。另一方面,set-url只做它在罐子上说的。

我尝试了上面的解决方案,但由于某些原因出现了一堆问题。以下是备选方案。

在一个新的存储库中:

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

无论何时根存储库子模块哈希发生变化,您都需要同步子模块:

  1. 更新根存储库
  2. CCD_ 39可能与CCD_ 40和CCD_

我曾尝试修改如上所述的配置文件,但遇到了一个新问题:现在,我得到的不是错误的URL和致命的错误:"致命:无法获取子模块"xxx\xxxxx\xxx"的存储库句柄;。仅仅更改URL似乎就把问题推到了其他地方,程序仍然无法到达我想要的子模块。

最新更新