Git subtree split触发最大函数递归深度报错该如何解决?
报错根本原因
你遇到的递归深度限制并非Git核心C代码的硬编码限制:
git subtree本质是Shell脚本,对应你报错路径中的/usr/lib/git-core/git-subtree文件,并非C编译的Git核心组件- 报错里的1000递归深度阈值是你的Ubuntu 21.04默认Shell环境的配置,而非Git的限制
- 同事执行正常是因为其Shell默认的递归深度阈值更高,或Shell版本、配置与你存在差异
修复方案
方案1:临时修改(当前终端会话生效)
执行split命令前,先在当前终端运行以下命令调高Shell递归深度阈值:
export FUNCNEST=2000
再执行你的git subtree split -P foo/ -b "foo-branch"命令即可,阈值可以根据仓库规模调整为3000、5000等值。
注:
FUNCNEST是Bash/Sh内置的控制函数递归深度的环境变量,大部分桌面发行版默认值为1000,即你报错中触发的阈值。
方案2:永久生效
将export FUNCNEST=5000写入你当前使用Shell的用户配置文件(~/.bashrc对应Bash,~/.zshrc对应Zsh),保存后执行source ~/.bashrc(或对应你修改的配置文件)即可长期生效。
方案3:升级Git版本
你当前使用的Git 2.30.2为2021年发布的旧版本,2.38及以上版本的Git对git subtree split的递归逻辑做了大幅优化,大仓库执行时的递归深度显著降低,无需修改Shell配置即可正常运行。你可以通过官方Git PPA源升级到最新稳定版Git解决问题。
关于Git递归深度自定义的说明
- Git核心C组件的相关递归深度大多支持通过
git config自定义配置,例如diff递归、子模块递归相关参数 - 本次报错涉及的
git-subtree脚本的递归深度不属于Git核心配置项,修改Shell的FUNCNEST环境变量即可自定义调整阈值
内容的提问来源于stack exchange,提问作者Sváťa Filev
相关产品推荐
相关产品推荐

