关于git 子仓库管理的一些实验及结论(git subtree)
- 关于子仓库管理的概念性区分("git submodule is link. git subtree is copy")
- 无论新增子仓库、从子仓库拉取、向子仓库推送,都需要
<prefix> <repo-path> <branch>
这些选项。(实际参数实例--prefix=testBakSubtree D:\shareTemp\test\playground2\repos\subtree.git master
) - 父仓库可以通过
git subtree pull --prefix=testBakSubtree D:\shareTemp\test\playground2\repos\subtree.git master
拉取子仓库信息。前提是要先执行增加子仓库命令git subtree add <prefix> <repo-path> <branch>
- 父仓库可以通过
git subtree push <prefix> <repos-path> <branch>
推送更新到子仓库源码管理中。但如果想子仓库顺利接受推送,那这个子仓库要是一个裸仓库。需要指出的是,从子仓库拉取时,不要求子仓库是裸仓库。推送只会推送子仓库相关更新
参考:
- https://www.cnblogs.com/goloving/p/16678440.html "浅析Git Subtree的原理与实际应用:git subtree是什么、子仓库与仓库共用、共用代码需求常规处理方式及为什么使用git subtree以及如何使用Git Subtree在多个Git项目间双向同步子项目"
延申
裸仓库概念
- 裸仓库是一个没有工作区的 Git 仓库(即仅含 .git 目录的仓库)
- stackoverflow 上的一个讨论 提出了 3 种方式从普通仓库转换为一个裸仓库。这些方式体现在 仓库初始化的方式、配置文件的处理、钩子的保留 和 工作区的处理 上
- 通过移动 .git 目录并设置 core.bare 属性创建的裸仓库
- 通过 git clone --bare 创建的裸仓库
- 通过 git clone --mirror 创建的裸仓库