Git Subtree无Squash推送超时问题及多场景适配咨询
Git适配特殊业务场景的问题与方案探讨
业务场景与历史痛点
- 背景:每年新建15-20个项目,均依赖一个由两个Python文件组成的「公共库」
- 历史方案:下载公共库副本上传到项目仓库,引发以下问题:
- 丢失Git版本管理特性
- 公共库后续更新难以同步到各项目
- 无法向公共库上游贡献功能
三类核心使用场景
- 只读使用:直接引入内部公共库仓库,不做任何修改
- 项目定制化:在项目仓库中修改公共库代码,但不推送到公共库上游
- 上游贡献:修改公共库代码后,推送到原GitHub远程仓库并提交贡献
现有方案对比
Git子模块(submodules)
- 仅适配场景1、3,完全不支持场景2
- 曾尝试用脚本处理场景2(重命名.git目录),但操作繁琐,对Git经验不足的同事不友好
Git subtree
- 基本覆盖三类场景:
- 场景1:可将公共库添加到项目仓库并关联提交,支持拉取公共库更新
- 场景2:修改公共库代码后仅推送到项目仓库远程,无需影响上游
- 场景3:初步测试可行,备选路径包括:从团队仓库拉取后推送到分支再PR到main,或推送到个人复刻库再PR到主库(暂未确定最优方案)
- 同事提出的替代方案:仅用submodules,为每个项目在公共库主仓库新建分支
- 反对理由:每年新增20个永久分支,会导致仓库分支混乱,项目逻辑分散在两个仓库,复杂度大幅提升;暂不确定该方案是否真的更优
技术问题与疑问
1. Git subtree推送超时问题
- 添加公共库命令(未加
--squash,目的是在PyCharm中查看完整历史):
git subtree add --prefix=Common_Library link/to/teams/Common_Library.git main
- 推送命令(两种远程均出现超时):
git subtree push --prefix=Common_Library link/to/teams/Common_Library.git update1
git subtree push --prefix=Common_Library link/to/personal/Common_Library.git update1
- 现象:出现「2/68 (200) [200]」提示,重试200次后停止,无明确错误日志
- 矛盾点:添加
--squash后推送正常,但PyCharm中无法查看公共库历史,担心后续合并/拉取出问题;但推送后GitHub上能看到完整历史,合并到复刻库main后也能看到,疑惑是否误解了--squash的作用
2. 公共库结构导致的推送差异
- 两个版本的公共库:
- 版本A:文件直接存放在仓库根目录
- 版本B:文件存放在仓库内的文件夹中
- 现象:版本B可通过初始化项目仓库、拉取到指定文件夹后直接推送到项目远程;版本A无法实现该操作,求原因
内容的提问来源于stack exchange,提问作者krusion
相关产品推荐
相关产品推荐

