git subtree:无缝管理通用子项目

作者: 齐修_qixiuss | 来源:发表于2016-05-25 14:13 被阅读5475次

由于移动互联网的爆发以及响应式页面的尴尬症,开发web和mobile项目成为了标配,当然实际情况下,会有更多的项目。

多项目开发对于前端来说是个很大的挑战
✦ 重复,重复的前端架构,重复的前端依赖,重复的工具函数等
✦ 局限,不同后台有不同的规则,“因地制宜”真难受,刚伺候好rails又突然来个php
✦ 最优,后台工程做前端构建,总是显得不够“最优”。

所以,我们需要单独抽离出前端开发项目,按照前端的方式来组织代码,通过构建工具来对前端资源文件做最优处理
那么新问题来了,如何管理这个快速迭代,频繁更新的前端项目呢?
✦ 作为单独的项目管理?
✦ 用git submodule or git subtree管理?

多个后台项目:qdaily4_web/moible/app
前端项目:qdaily4_feboierplate

之前的开发模式

✦ 在qdaily4_feboierplate项目中修改前端代码
✦ 构建qdaily4_feboierplate项目,输出到qdaily4_web/mobile/app
✦ 提交qdaily4_feboierplate项目的改动
✦ 在qdaily4_web/mobile/app项目中修改后台代码
✦ 提交qdaily4_web/mobile/app项目的改动,其中包括qdaily4_feboierplate项目构建输出的文件

这种开发模式解耦了前端项目和后台项目,前端项目严格按照前端的代码结构去组织代码,能够实现模块化,按需加载,就近原则,图片压缩等功能。缺陷在于需要频繁的切换项目提交代码。

为了解决频繁切换项目的问题,调研了git submodule和git subtree之后,选择用git subtree来解决这个问题。

现在的开发模式

qdaily4_feboierplate作为qdaily4_web/mobile/app的子项目,别名appfe
✦ 在appfe项目中修改前端代码
✦ 构建appfe项目,输出到qdaily4_web/mobile/app
✦ 提交qdaily4_web/mobile/app项目的改动(也会记录appfe项目的改动)
✦ 使用git subtree命令提交appfe的改动到qdaily4_feboierplate

引入git subtree之后,不再感觉是在开发两个项目,不需要频繁的切换项目提交代码,只需要使用git subtree命令就可以实现qdaily4_feboierplate项目的双向更新,快速开发。缺陷在于存在多个qdaily4_feboierplate项目的拷贝。

双向更新

前端项目qdaily4_feboierplate是作为子git被包含到多个后台项目中,我们通过git subtree pull & git subtree push实现qdaily4_feboierplate的双向更新,对于不稳定且需要快速迭代的模块代码恰到好处。

利用git subtree来管理前端模块项目和多个后台环境项目,可以有效快捷的实现前端模块项目快速开发,双向更新,配合上前端构建系统,简直爽翻了。

小技巧

git仓库取别名

使用appfe作为git@bitbucket.org:qdaily/qdaily4_feboierplate仓库的别名
✦ 直接命令行输入:

git remote add appfe git@bitbucket.org:qdaily/qdaily4_feboierplate.git

✦ 也可以通过配置.git/config文件:

[remote "appfe"]
    url = git@bitbucket.org:qdaily/qdaily4_feboierplate
    fetch = +refs/heads/*:refs/remotes/appfe/*

git指令自定义

git subtree pullgit subtree push 是需要频繁使用的命令,我们可以通过自定义来让git指令更简单更好记

✦ 直接命令行输入

git subtree pull --prefix=appfe appfe master
git subtree push --prefix=appfe appfe master

✦ 也可以配置.git/config让git subtree的命令更简单
!:表示外部命令而不是git命令,相当于直接在shell中运行!后的组合命令。
$1:表示shell传进来的第一个参数,比如git stpull demo/xxx,那么$1就是demo/xxx
::组合命令尾部的:很神奇,没有它,最后一个指令不会运行,所以它起到一个占位的作用。
第二版Tip:
✦ 可以看出,如果当前分支没有stash的东西,这个组合命令会出现问题,还未想到解决方案,有了解的人可以留言指出。

// 第二版
// git stpull demo/xxx
// git stpush demo/xxx
[alias]
    stpull = !git stash \
        && git subtree pull --prefix=appfe appfe $1 \
        && git stash pop \
        && :
    stpush = !git stash \
        && git subtree push --prefix=appfe appfe $1 \
        && git stash pop \
        && :

第三版Tip:
✦ 放弃了stash,让用户自己去处理stash相关的事情。
✦ 使用两个参数,表示子项目目录和分值名称,这样可以兼容处理多个子项目,不同分支的情况。
✦ 使用git subtree split --rejoin,解决了每次提交都需要重头遍历commits耗时过长的问题。
✦ 每次git subtree push之前都先git subtree pull,是为了解决错误时机git subtree split导致push失败。
✦ 初次运行时,远端没有demo/xxx分支,需要使用git subtree push -P appfe demo/xxx新建远端分支。

// 第三版
// git stpull appfe demo/xxx
// git stpush appfe demo/xxx
[alias]
    stpull = !git subtree pull --prefix=$1 appfe $2 \
        && :
    stpush = !git subtree pull --prefix=$1 appfe $2 \
        && git subtree split --rejoin --prefix=$1 $2 \
        && git subtree push --prefix=$1 appfe $2 \
        && :

自定义git指令对于一些常使用的长命令很有效,强烈建议使用!

相关文章

  • git subtree:无缝管理通用子项目

    由于移动互联网的爆发以及响应式页面的尴尬症,开发web和mobile项目成为了标配,当然实际情况下,会有更多的项目...

  • git subtree 的命令和使用说明

    git subtree add --prefix= git subtree add --...

  • 使用git subtree & submodule管理多个子项目

    本文首发在segmentfault中 背景 最近工作中遇到了一个问题:随着项目越来越多,很多项目依赖同一个模板或是...

  • git subtree 的使用

    参考:Git Tools - Subtree MergingThe power of Git subtreegit...

  • git merge two repos

    git clone git_linkFirstly add subtree, from which you wan...

  • Git依赖subtree

    Git依赖——subtree  与submodule相比,subtree的优势在于主项目与子模块的双向 通信,即主...

  • git subtree

    使用GIT SUBTREE集成项目到子目录 使用场景 例如,在项目Game中有一个子目录AI。Game和AI分别是...

  • git subtree

    在生成gitHub page ,打算将打包的doc 文件单独作为一个github page 分支时候了解到一个gi...

  • git subtree

    git subtree 1.在A项目中添加一个远程连接如下: 2.使用subtree命令添加需要依赖的远程仓库 3...

  • git submodule 管理子项目

    使用场景 拆分项目,当项目越来越大之后,我们希望 子模块 可以单独管理,并由 专门 的人去维护,这个时候只可以使用...

网友评论

    本文标题:git subtree:无缝管理通用子项目

    本文链接:https://www.haomeiwen.com/subject/ixktdttx.html