Techyou labs
文章RSS
评论RSS
登录
真正的爱应该超越生命的长度,心灵的宽度,灵魂的深度
搜索
关于作者
文章分类
Default
Linux/Unix
Database
Cloud
Networking
Security
Programming
最新文章
openvpn自签名证书
带你重走 TiDB TPS 提升 1000 倍的性能优化之旅
Unicode 中的 BIDI 双向性算法[转]
在linux中设置优先使用ipv4,而不是ipv6
linux下WPS高分辨率下因字体缩放导致字体发虚的问题
ssh-rsa not in pubkeyacceptedalgorithms问题解答及处理办法 Permission denied (publickey)
在 Ubuntu 22.04 中使用 PipeWire 替换 PulseAudio
MYSQL简单监控指标
deepin-wine6-stable下TIM悄悄崩溃问题
openwrt 设置ipv6地址分配
最新评论
renothing: 备注:路由器端优先设置ipv4并不影响客户端的ip...
renothing: 二次反向代理跟你应用程序得处理时间有关系吧?尤其是...
二次反向代理性能很差,怎么优化的?: 我也用nginx 做了个二次反向代理,但是并发连3...
hostyep: 交换链接么?目前每天保持30个左右对口IP,每月都...
yzhkpli: error while loading share...
美肤宝: 感谢分享。。。
lq: 嗯 喜欢弄得点单点
按月归档
August 2023
March 2023
December 2022
November 2022
September 2022
August 2022
March 2022
January 2022
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
February 2021
September 2020
May 2020
September 2019
August 2019
July 2019
June 2019
May 2019
January 2019
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
April 2018
March 2018
December 2017
October 2017
September 2017
August 2017
April 2017
March 2017
February 2017
August 2016
July 2015
November 2014
September 2014
August 2014
July 2014
June 2014
July 2013
April 2013
September 2012
July 2012
May 2012
April 2012
February 2012
January 2012
December 2011
November 2011
October 2011
September 2011
August 2011
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
December 2009
November 2009
October 2009
September 2009
August 2009
June 2009
May 2009
April 2009
March 2009
February 2009
December 2008
November 2008
September 2008
August 2008
July 2008
June 2008
常用标签
Mysql
nginx
mysql优化
linux
debian
Powered by
Typecho)))
Optimized by
EAimTY
git subtree使用场景
September 21, 2017
假设你有一个在线商城项目 Shop,这个项目下有个订单模块 order,这个 order 模块很通用,你在下一个团购系统 Groupon,也要用到这个 order 模块,最简单的方式就是把整个 order 模块 copy 过来。 然而,这种 copy 方式,会很难维护:order 模块修改了一个Bug,然后又要复制更新到所有用了 order 模块的项目里。 这时就需要 git subtree 来管理这个 order 模块了:把 order 模块单独作为一个 git 仓库,在需要用到 order 模块的项目,通过使用 git subtree 把 order 模块当作一个 git 项目来引入,这就解决了 order 模块的共享和维护问题。 git subtree --help 可以查看 git subtree 命令的帮助文档。 git subtree 命令中,都会用到一个参数 --prefix=
,可以简写成 -P
,本文的命令都是这样使用的。 ##git subtree add 添加项目作为子树 ``` git subtree add -P <子树名> <子仓库地址> <分支> ``` 执行以上命令后,项目下就会新创建一个名为 <子树名> 的目录。 如果提前使用 git remote add <子仓库名> <子仓库地址> 添加了子项目的远程仓库地址(建议按此方式,下文都基于此),那么也可以这样: ``` git subtree add -P <子树名> <子仓库名> <分支> ``` 以上命令可以多加一个 --squash 参数: ``` git subtree add -P <子树名> <子仓库名> <分支> --squash ``` --squash 参数含义是:把 subtree 的改动合并成一次commit,这样就不用写入子项目完整的历史记录。 ##git subtree pull 从子仓库拉取子树更新 先 fetch: ``` git fetch <子仓库名> <分支> ``` 后 pull: ``` git subtree pull -P <子树名> <子仓库名> <分支> ``` 以上命令也可以多加一个 --squash 参数: ``` git subtree pull -P <子树名> <子仓库名> <分支> --squash ``` ##git subtree push 推送子树更新到子仓库 ``` git subtree push -P <子树名> <子仓库名> <分支> ``` ##场景一:把其他已有项目,添加为子树 场景假设:新建了一个团购系统项目 Groupon,也需要用到 order 模块,那么按以下步骤即可: ###添加子项目的远程仓库地址: ``` git remote add order-repo https://github.com/xxx/order.git ``` ###在 Groupon 项目里进行添加项目作为子树: ``` cd Groupon git subtree add -P order order-repo master --squash git subtree pull -P order order-repo master ``` ##场景二:把项目里的某个目录,分割出去作为子树维护 场景假设:现在在开发 Shop 项目有一段时间了,发现里面的 order 模块非常通用,着手使用 git subtree 把 order 作为一个子项目单独维护。 ###方式一:分割出去,并清理 commit 记录 ``` cd Shop git subtree split -P shop -b order-branch //1 cd ../ //2 mkdir tempDir //2 cd tempDir //2 git init //2 git pull ../Shop order-branch //2 git remote add order-repo https://github.com/xxx/order.git //3 git push -u order-repo master //3 cd ../ //4 rm -rf tempDir //4 cd Shop //5 git filter-branch -f --index-filter "git rm -r -f -q --cached --ignore-unmatch order" --prune-empty HEAD //5 注意:这里是 order,那个子目录(-P 对应的值) git branch -D order-branch //6 ``` 流程说明: 1. 在 Shop 项目里把 order 模块分割成一个临时分支 order-branch 2. 项目外新建一个临时目录 tempDir 并创建 git 仓库,拉取这个 order 模块的临时分支 order-branch 3. 在临时目录里,添加 order 子项目的远程仓库地址,并 push 到该远程仓库 4. 删除临时目录 tempDir 5. 清理掉原来的 order 模块的 commit 记录 6. 按需删除临时分支 order-branch 当然,把 order 模块抽离出去之后,这个 Shop 项目还是需要用到 order 模块的,重新走一遍 《场景一(把其他已有项目,添加为子树)》 的流程就可以了: ``` cd Shop git remote add order-repo https://github.com/xxx/order.git git subtree add -P order order-repo master --squash git subtree pull -P order order-repo master ``` ##方式二:直接作为子树提交到子仓库,不清理 commit 记录 git subtree --help 查看文档,git subtree push 命令本身就会进行 git subtree split 操作: ``` Does a split (see below) using the
supplied and then does a git push to push the result to the repository and ref. This can be used to push your subtree to different branches of the remote repository. ``` 所以简单点就 git subtree push 完事。 ``` cd Shop git remote add order-repo https://github.com/xxx/order.git //1 git subtree push -P order order-repo master //2 ``` 流程说明: 1. 添加 order 子项目的远程仓库地址 2. order 模块作为 order 子树 push 到远程仓库 ##场景三:在现有项目里,新建了一个子模块(子目录),准备当作子树维护 场景假设:现在在开发 Shop 项目,刚新建了个 order 模块(还未提交到git),准备把这个 order 模块当作一个子项目维护。 ###方式一:子模块(子目录)单独提交到远程仓库,删除子模块(子目录)后,重新引入 ``` cd Shop/order //1 git init //1 git add . //1 git commit -m "add order ..." //1 git remote add order-repo https://github.com/xxx/order.git //1 git push -u order-repo master cd ../ //2 rm -rf order //2 git remote add order-repo https://github.com/xxx/order.git //3 git subtree add -P order order-repo master --squash //3 ``` 流程说明: 1. 进入 order 模块创建仓库、提交、添加远程仓库地址、push 2. 删除 order 模块 3. 添加 order 子项目远程仓库地址,git subtree add 添加 order 子项目作为子树 ###方式二:先把子模块(子目录)提交,然后 git subtree push 场景二 里的 《 方式二:直接作为子树提交到子仓库,不清理 commit 记录》 一样了。 ##四:删除子树 场景假设:突然有一天,Shop 项目不再开放下单功能,以后也仅仅做静态展示,很确定 order 子模块可以删除了,那么有以下两种删除途径。 ###删除子模块目录,并commit ``` git rm -r <子模块目录名> git commit -m "remove <子模块目录名> ..." ``` 此方式的缺点就是 git log 里还有留着 order 子模块的 commit 历史。 ###使用 filter-branch 彻底删除 ``` git filter-branch -f --index-filter "git rm -r -f -q --cached --ignore-unmatch order" --prune-empty HEAD //注意:这里是 order,那个子模块(-P 对应的值) ``` 此方式可以把order 子模块的 commit 历史一并删除。完成后push需要--force参数 ##五:重命名子树 直接重命名子树的目录名,并提交: ``` cd shop mv order xiadan git add . git commit -m "reanme order -> xiadan" ``` 只是以后 pull 和 psuh 子树的命令要改变少少: ``` git subtree pull -P xiadan order-repo master //原来的 -P 参数值也由 order 改成 xiadan git subtree push -P xiadan order-repo master //原来的 -P 参数值也由 order 改成 xiadan ```
暂无评论
添加新评论
称呼
Email
网站
取消回复
内容
发表评论