Git子模块加载失败(协议问题)致Drupal项目构建受阻,求解决方案
解决Drupal子模块克隆超时问题及快速修改GA ID方法
我们收购了一个包含数十个子模块、构建流程复杂的Drupal网站,使用git clone --recursive <GitHub复制的.git URL>克隆仓库并安装子模块时,每次执行到microdata子模块都会失败,报错信息如下:
Submodule 'tests/MicrodataPHP' (git://github.com/linclark/MicrodataPHP.git) registered for path 'src/sites/all/modules/contrib/microdata/tests/MicrodataPHP' Cloning into '<local path>/src/sites/all/modules/contrib/microdata/tests/MicrodataPHP'... fatal: unable to connect to github.com: github.com[0: 140.82.113.3]: errno=Operation timed out fatal: clone of 'git://github.com/linclark/MicrodataPHP.git' into submodule path '<local path>/src/sites/all/modules/contrib/microdata/tests/MicrodataPHP' failed
已尝试以下方案但均无效:
- 单独克隆MicrodataPHP仓库(HTTPS和GIT协议均能正常克隆)
- 移除项目中对microdata的引用
- 将microdata的URL从HTTP改为HTTPS
- 直接下载Drupal microdata仓库并添加到项目中
- 直接下载MicrodataPHP仓库并添加到项目中
目前困境:仅需修改仓库中一行内容更新Google Analytics ID,但本地无法构建验证;推送PR后Travis构建因相同错误失败,无法部署;且网站采用Docker Swarm,无法直接在生产环境修改。
解决方案
一、解决子模块克隆超时问题
- 全局替换git协议为HTTPS
执行以下命令,让所有git://协议的请求自动转为HTTPS,避开可能的git协议端口阻塞:
git config --global url."https://github.com/".insteadOf "git://github.com/"
之后重新执行git clone --recursive <GitHub复制的.git URL>即可。
- 手动初始化子模块并跳过问题模块
- 先克隆主仓库(不带
--recursive):
git clone <GitHub复制的.git URL>
- 进入仓库后初始化子模块,但跳过有问题的MicrodataPHP:
git submodule init git submodule update --exclude src/sites/all/modules/contrib/microdata/tests/MicrodataPHP
- 把本地单独克隆好的MicrodataPHP目录复制到上述跳过的路径,然后执行:
git add . git commit -m "Fix MicrodataPHP submodule clone issue"
- 修改.gitmodules文件同步URL
- 找到仓库根目录的
.gitmodules文件,将对应MicrodataPHP的条目:
[submodule "src/sites/all/modules/contrib/microdata/tests/MicrodataPHP"] path = src/sites/all/modules/contrib/microdata/tests/MicrodataPHP url = git://github.com/linclark/MicrodataPHP.git
修改为:
[submodule "src/sites/all/modules/contrib/microdata/tests/MicrodataPHP"] path = src/sites/all/modules/contrib/microdata/tests/MicrodataPHP url = https://github.com/linclark/MicrodataPHP.git
- 同步子模块配置并重新初始化:
git submodule sync git submodule update --init --recursive
二、无需全量构建修改GA ID的方法
如果仅需修改一行GA ID,可绕过全量构建流程:
直接修改目标文件
克隆主仓库(不带--recursive),找到存放GA ID的文件(通常是sites/default/settings.php或自定义模块的配置文件),直接修改对应行的ID。提交修改并调整Travis配置
- 提交修改后推送PR,同时修改仓库根目录的
.travis.yml,在构建前添加协议替换命令:
before_install: - git config --global url."https://github.com/".insteadOf "git://github.com/"
让Travis构建时自动转换协议,解决子模块克隆问题,完成部署。
内容的提问来源于stack exchange,提问作者commadelimited
相关产品推荐
相关产品推荐

