macos 上 git subtree 与 linux/windows 用法一致,因 git 1.7.11+ 已内置;需确认 git subtree --help 可用,否则升级 git;添加共享库用 git subtree add --prefix=...;同步用 pull;反向推送用 push;拆分用 split。
macos 上用 git subtree 管理共享代码库,和 linux/windows 基本一致,因为 git subtree 是 git 自带子命令(从 git 1.7.11 起内置),macos 安装的 git(包括 homebrew、xcode command line tools 或官网安装包)默认都支持,无需额外安装插件。
确认 git subtree 可用
终端执行:
git subtree --help
如果显示帮助文档,说明已就绪。若提示 unknown command,请升级 Git:
- 用 Homebrew:
brew install git或brew upgrade git - 用 Xcode 工具链:运行
xcode-select --install并确保 Command Line Tools 已安装
添加远程共享库到项目子目录
比如要把公共库 https://github.com/yourname/common-js.git 拉进当前项目 src/lib/common 目录:
- 先添加远程别名(方便后续操作):
git remote add -f common-js https://github.com/yourname/common-js.git - 再执行添加:
git subtree add --prefix=src/lib/common common-js main --squash
说明:加 --squash 可避免把整个历史拉进主项目日志,只保留一次合并提交,更干净;如需完整历史,去掉该参数即可。
日常同步更新(pull)
当共享库有新提交,想同步到你的项目中:
- 拉取最新变更:
git subtree pull --prefix=src/lib/common common-js main --squash - 也可直接用 URL(不依赖 remote 别名):
git subtree pull --prefix=src/lib/common https://github.com/yourname/common-js.git main --squash
注意:pull 实质是 fetch + merge,会生成一个合并提交,可正常 git push 到你的主仓库。
反向推送修改(push)
如果你在 src/lib/common 目录里改了共享代码,并希望把改动也提交回原共享库:
- 先按常规方式提交到你自己的项目:
git add src/lib/common && git commit -m "feat: update utils" - 再推送到共享库(需有写权限):
git subtree push --prefix=src/lib/common common-js main
这条命令会自动提取该子目录下所有相关提交,打包成新 commit 推到 common-js 的 main 分支——相当于“把你的修改反向贡献回去”。
拆分子目录为独立仓库(可选)
如果将来想把 src/lib/common 单独拎出来变成新仓库(比如开源或迁移):
- 创建新分支记录全部历史:
git subtree split --prefix=src/lib/common --branch common-split - 新建空目录并初始化:
mkdir ../common-standalone && cd ../common-standalone && git init - 把分支拉进来:
git pull ../your-project common-split
完成后,这个新目录就是一个拥有完整历史的独立 Git 仓库,可自由托管到 GitHub/GitLab。
不复杂但容易忽略:每次操作都要严格指定 --prefix 路径,且路径必须和当初 add 时完全一致;建议把常用命令记成 alias 或写进 Makefile,减少手误。











