【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

171 git subtree 管理子项目

转载 2016年05月31日 11:22:54

举个栗子:A项目需要在给某个子项目W里添加一个文件,最方便的方式自然是直接在A项目里改W子项目对应的目录里的代码,然后测试通过后,把这个更改提交到W子项目的 Git仓库里。如果这时候还要先单独更新W子项目的代码然后提交到 Git 服务器,再在A项目里把W子项目的代码更新过来,显然是很麻烦的,更麻烦的是如果发现代码有bug,还得再走一遍这个流程。

有什么方案?

  • Git Submodule:这是Git官方以前的推荐方案

  • Git Subtree:从 Git 1.5.2 开始,Git 新增并推荐使用这个功能来管理子项目

  • npm:node package manager,实际上不仅仅是 node 的包管理工具

  • composer:暂且认为他是php版npm、php版Maven吧

虽然 npm、composer、maven 等更侧重于包的依赖管理,以上几个方案都是能够做到在不同项目中同步同一块代码的,但没法双向同步,更适用于子项目代码比较稳定的情形。

Git Submodule 和 Git Subtree 都是官方支持的功能,不具有依赖管理的功能,但能满足我们的要求。Git Subtree相对来说会更好一些

Git Subtree 好在哪里

用一句话来描述 Git Subtree 的优势就是:

经由 Git Subtree 来维护的子项目代码,对于父项目来说是透明的,所有的开发人员看到的就是一个普通的目录,原来怎么做现在依旧那么做,只需要维护这个 Subtree 的人在合适的时候去做同步代码的操作。

它是怎么做到的呢?简单说下原理

Git Subtree 的原理

首先,你有两个伟大的项目——我们叫他P1项目、P2项目,还有一个牛逼的要被多个项目共用的项目——我们叫他S项目。我们通过简要讲解使用Subtree来同步代码的过程来解释Subtree的原理

1、初始化子项目Subtree

通过

cd P1项目的路径
git subtree add --prefix=用来放S项目的相对路径 S项目git地址 xxx分支

这样的命令,把S项目(我们姑且叫他S项目)的代码下载到--prefix所指定的目录——我们姑且叫他S目录把,并在P1项目里自动产生一个commit(就是把S目录的内容提交到P1项目里)。

对于P2项目也做同样的操作

2、像往常一样更新代码

大家在P1项目里各种提交commit,其中有些commit会涉及到S目录的更改,正如前面提到的,这是没任何关系的,大家也不会感受到有任何不一样。

3、提交更改到子项目的Git服务器

关键的地方来了:
当维护这个S项目 Subtree 的人希望把最近这段时间对S目录的更改提交到S项目的 Git 服务器上时,他执行一段类似于这样的命令:

cd P1项目的路径
git subtree push --prefix=S项目的路径 S项目git地址 xxx分支

Git 会遍历所有的commit,从中找出针对S目录的更改,然后把这些更改记录提交到S项目的Git服务器上

4、更新子项目新的代码到父项目

OK,现在S项目有大量的新代码了,P2项目也想使用这些新代码,维护P2这个Subtree的人只要执行:

git subtree pull --prefix=S项目的路径 S项目git地址 xxx分支

这样就可以将P2项目里S项目目录里的内容更新为S项目xxx分支的最新代码了。

我总结的 Git Subtree 简明使用手册

假设,你要在各个项目里的components/zenjs这个目录对 http://github.com/youzan/zenjs.git 这个项目做Subtree

1.首先必须确保各个项目已经添加zenjs 这个 remote(关于remote是什么可以看这里):

git remote add zenjs http://github.com/youzan/zenjs.git

2.将zenjs添加到各个项目里

git subtree add --prefix=components/zenjs zenjs master

3.各项目更新zenjs代码的方法:

git subtree pull --prefix=components/zenjs zenjs master

4.各项目提交zenjs代码的方法:

git subtree push --prefix=components/zenjs zenjs hotfix/zenjs_xxxx

这会在远程的zenjs的仓库里生成一个叫 hotfix/zenjs_xxxx 的的分支,包含了你过去对components/zenjs 所有的更改记录

5.把hotfix/zenjs_xxx分支更新并合并到master并提交

这样其他工程就可以更新到你提交的代码了。

有人可能会问,只用master分支,不管版本,太有风险了。

对的,正如我们前面说到的那样,subtree的方案适用的场景是:各个项目共用一个库,而这个库正在快速迭代更新的过程中。如果追求稳定,只需要给库拉出一个如v0.1.0这样的版本号命名的稳定分支,subtree只用这个分支即可。

我们现在使用的方式就是:A项目经常会对zenjs做更新,所以A项目用subtree来双向同步;B项目只是使用,所以用bower用来按版本来更新代码。

高阶功能

重新split出一个新起点(这样,每次提交subtree的时候就不会从头遍历一遍了)

git subtree split --rejoin --prefix=components/zenjs --branch new_zenjs
git push zenjs new_zenjs:master

本文首发于我的
个人技术博客:http://delai.me/code/git-subtree/
SegmentFault专栏:http://segmentfault.com/a/1190000003969060
转载请注明出处


2016年3月3日,update,补充 subtree 的使用场景

举报

相关文章推荐

Git 教程 - Git 基本用法

目录(?)[+] Git 教程 - Git 基本用法 您的评价:          收藏该经验 Git 是当前最流行的版本控制程序之一,文本包含了 Git 的一些基本用法 创...

git subtree用法

来源于:http://aoxuis.me/posts/2013/08/07/git-subtree/ 使用场景 例如,在项目Game中有一个子目录AI。Game和AI分别是一个独立的git项目,可以分开维护。为了避免直接复制粘贴代码,我们希望Game中的AI子目录与AI的git项目关联,有3层意思: <ol class="order-list" style=

使用Maven管理项目中子项目

假如有一个mydemo的web项目,在这里我将该项目分为两个模块,分别为mydemo-core和mydemo-web,其中mydemo-core项目为核心java程序文件,输出为jar文件;mydemo-web为web部分,自身基本没有java程序文件,除了一部分与web集成较为紧密的,它主要使用mydemo-core生成的java lib。我们用maven创建一个project,来管理该项目,而mydemo-core和mydemo-web同时又是eclipse project,可以直接在eclipse中打开,并进行程序开发。 [b]1.创建mydemo项目[/b] [c

git subtree有效管理公共第三方lib

如果你的项目中有很多第三方的lib,你希望使用它,并且也希望可能对该lib做修改并且贡献到原始的项目中去,或者你的项目希望模块化,分为几个repo单独维护,那么git subtree就是一个选择。gi...

Git子项目

简介 Git子项目也就是submodule,它允许你在主项目的某个子目录下嵌入另外一个git仓库。gitlink是实现子项目的基础。当git add命令遇到某个子本身是git仓库的子目录时,它会创建gitlink而不是把子目录中的所有文件和目录加到主项目的git仓库中去。通过git ls-tree命令可以查看当前仓库是否包含子项目。比如,Vim常用git和pathogen来管理插件。这些插件本身都在github上找到。这时使用子项目方式
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)