Git 进阶 - 子仓库 subtree
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git 进阶 - 子仓库 subtree相关的知识,希望对你有一定的参考价值。
参考技术A问题实例(真实诉求)
一个工具类库,有以下两个目标:
如果直接使用 Git 管理这个lib 添加到这个项目来呢,单独维护。可能就会出现每一次更新 repo 就要更新多个 repo 的情况。对于有很多开发协同者来说,简直是灾难。
git subtree 是什么?
git subtree 可以实现 一个仓库作为其他仓库的子仓库 ,能够相对较好的解决上面两难问题。
有个和 git subtree 概念类似的功能 git submodule ,虽然都没有用过,但目前来看 git subtree 比 git submodule 更加强大,是可以替代 submodule 的方案。
subtree 的作用就是可以实现一个仓库作为其他仓库的子仓库,对于主项目来说,另一个项目只作为主项目的一个子目录而存在。
图片来自 : https://segmentfault.com/a/1190000012002151
创建一个git repo GitStudy
创建一个 lib repo commonToolsCopy
使用 subtree 命令,将 tools 放到 gitStudy 目录下(作为lib)
下面 commonTools
上面命令执行后,就可以将 commonTools 仓库中 master 上的更新更新到本地
之后会生成两条日志信息
添加之后 commonTools 就是主项目的一个普通文件夹,如果这时候 commonTools 内容更新之后,正常 git push 即可,子项目对于主项目来说完全是透明的。
在主项目 git push 之后,对子项目修改的内容是不会直接更新到子项目自身的
需要执行 git subtree pull
如果单独对子项目做了更新,主项目就需要手动更新下了
执行之后,仍然会在主项目中生成相关的 commit 记录
在 subtree 相关命令经常会用到 <repository> 每次都写地址还是比较麻烦,这里可以用 git remote 命令简化写法,为这个远程地址定义一个 “别名”
比如使用 subtree push 的时候就可以使用如下命令
在添加 subtree 的时候是指定了分支的,如果要切换分支直接移除 subtree,重新加入子项目的分支
验证1:其他人 clone 该项目对 sub repo是无感知的
验证2:在主项目中修改 sub repo 的内容 push,在 app 中会形成 commit 在 sub repo 中不会有 commit
验证3:使用一下命令,可以push 到 sub repo 中 推送修改到源仓库
验证4:直接在 sub repo 项目中更新内容
那么 main repo 需要还是需要 pull 一下 从源仓库拉取更新
非原理性提示 不加 --squash 不可以,
在 pull 的过程中可能需要处理冲突
验证5:修改的内容同时包含主项目和子项目, 使用 git push 再使用 git subtree push 会做挑拣,但如果混杂的内容很多的话,这个过程也会变得复杂,so 建议 尽可能分开提交,减少这种冲突。
https://segmentfault.com/a/1190000012002151
http://einverne.github.io/post/2020/04/git-subtree-usage.html
git submodule subtree常用指令
submodule
添加
git submodule add -b master git@git.xxx:xxx/xxx.git src/xxx
删除
git submodule deinit -f src/xxx // 取消注册 git rm -rf src/xxx // git 工作树和索引中删除文件 rm -rf .git/modules/src/xxx
subtree
带着提交记录来拷贝仓库的话就用subtree
git subtree add --prefix=src/xxx git@git.xxx:xxx/xxx.git master
以上是关于Git 进阶 - 子仓库 subtree的主要内容,如果未能解决你的问题,请参考以下文章