Git subtree和Git submodule

git submodule允许其他的仓库指定以一个commit嵌入仓库的子目录。

git subtree替代git submodule命令,合并子仓库到项目中的子目录。不用像submodule那样每次子项目修改了后要init和update.万一哪次没update就直接"commit -a" 或者 "add ." 全commit上去就悲剧了。

git subtree虽然比git submodule更好用,但也不是特别完美的解决方案,使用时一定要特别注意。

git-subtree参考文档:https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt

使用语法

‘git subtree‘ add -P <prefix> <commit>
‘git subtree‘ add -P <prefix> <repository> <ref>
‘git subtree‘ pull -P <prefix> <repository> <ref>
‘git subtree‘ push -P <prefix> <repository> <ref>
‘git subtree‘ merge -P <prefix> <commit>
‘git subtree‘ split -P <prefix> [OPTIONS] [<commit>]     
-q | --quiet
-d | --debug
-P <prefix> | --prefix=<prefix>      引用库对应的本地目录
-m <message> | --message=<message>   适用于add/pull/merge子命令。设置产生的合并提交的说明文本
--squash                             适用于add/pull/merge子命令。先合并引用库的更新记录,将合并结果并到主项目中。
使用此选项时,subtree add/pull会产生两个提交版本:一个是子项目的历史记录,一个是Merge操作。好处是可以让主项目历史记录很规整,缺点是子项目更新时常常需要解决冲突。一个更好的解决方案是:单独建一个分支进行--no-squash的subtree更新,然后再--squash合并到主分支。每次在此分支做操作前都需要先把主分支合并进来。参考:http://www.fwolf.com/blog/post/246
split子命令选项:--annotate=<annotation>              创建合成历史时有可能形成内容不同但提交信息完全相同的提交版本,使用这个选项在每个提交消息前加上此前缀用来区分。-b <branch> | --branch=<branch>      创建合成的提交历史时,创建此参数指定的新分支包含生成的合成历史。<branch>必须是还不存在的。--onto=<onto>--rejoin--ignore-joins

更多的内容参考前面的文档链接。

git subtree用法简单示例

引用外部库到项目子目录

git subtree add --prefix=Vendor/AFNetworking --squash http://demorepo.com/AFNetworking/AFNetworking.git master
或
git remote add -f  librepo ../lib-rep        #-f:远端库添加后立即执行fetch操作
git subtree add -P lib  librepo master     

提取引用库的修改到新分支

git subtree split  --prefix=Vendro/AFNetworking/  --branch AFNetworking      #提取与引用库子目录相关的变更并生成一个新的合成历史到新分支

推送引用库分支到引用库远端

git push [email protected]:kvnsmth/AFNetworking.git AFNetworking:critical-bug-fix
或
git subtree push -P lib  librepo master

拉取引用库的最新代码

git subtree pull --prefix=Vendor/AFNetworking --squash [email protected]:AFNetworking/AFNetworking.git master
或
git subtree pull -P lib librepo master

git-subtree不能处理快进(Fast-forward),快进的情况也会误报冲突,还需要手动解决冲突

时间: 2024-08-07 01:46:53

Git subtree和Git submodule的相关文章

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

移动互联网的爆发以及响应式页面的尴尬症,开发web和mobile项目成为了标配,当然实际情况下,会有更多的项目. 多项目开发对于前端来说是个很大的挑战? 重复,重复的前端架构,重复的前端依赖,重复的工具函数等? 局限,不同后台有不同的规则,"因地制宜"真难受,刚伺候好rails又突然来个php? 最优,后台工程做前端构建,总是显得不够"最优". 所以,我们需要单独抽离出前端开发项目,按照前端的方式来组织代码,通过构建工具来对前端资源文件做最优处理那么新问题来了,如何

[Git] 使用 Git SubTree 来共享函示库源代码

采用 GitSubtree 的方式来共用多个 project 会共用的 sourceCode,不过 subtree 的数据似乎不多,查到的数据都没有顺利的让我完成我的 subtree 情境,所以自己参考数据并且尝试成功后,就写一篇 blog 来记录一下,希望 subtree 以后会更方便用 写在前面的前面 (2017/05/06更新) 经过了大概几个月的使用,近日决定放弃用 Subtree 改回用 SubModule,因为遇到了一些问题,最严重的是两个使用同一个 Subtree 会莫名的不同步,

使用GIT SUBTREE集成项目到子目录(转)

原文:http://aoxuis.me/post/2013-08-06-git-subtree 使用场景 例如,在项目Game中有一个子目录AI.Game和AI分别是一个独立的git项目,可以分开维护.为了避免直接复制粘贴代码,我们希望Game中的AI子目录与AI的git项目关联,有3层意思: AI子目录使用AI的git项目来填充,内容保持一致. 当AI的git项目代码有更新,可以拉取更新到Game项目的AI子目录来. 反过来,当Game项目的AI子目录有变更,还可以推送这些变更到AI的git项

git subtree 使用

这个是备忘录.原网页(https://medium.com/@porteneuve/mastering-git-subtrees-943d29a798ec , http://cncc.bingj.com/cache.aspx?q=master+git+subtree&d=5034897297048421&mkt=zh-CN&setlang=en-US&w=LLr-ePxnq8vxmyPDrHjzRWkbxVPwbcO4)被gfw墙,从cache中复制过来的,以备忘. Mas

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

如果你的项目中有很多第三方的lib,你希望使用它,并且也希望可能对该lib做修改并且贡献到原始的项目中去,或者你的项目希望模块化,分为几个repo单独维护,那么git subtree就是一个选择. git subtree是附属于git的附加工具,默认情况下并不会安装.https://github.com/git/git/tree/master/contrib/subtree. # git clone https://github.com/git# cd git # make prefix=/us

git subtree

此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 目前对 git 仓库拆分的已有实现之一.这里 git subtree 并不是 subtree merge strategy,这两个不是一个东西. 准备工作 首先创建主仓库 subrepo-master,随意提交一次文本,接着拉取到本地 建立子仓库 subrepo,随意提交一次文本,同时准备多个分支进行任意提交备用. 操作 运行 git remote add subtree1 <url> 添加子仓库链

Git 子模块:git submodule

imtianx 2018年03月08日阅读 2057 Git 子模块:git submodule 工作中,可能会遇到在一个Git仓库 中添加 其他 Git 仓库的场景.比如,在项目中引用第三方库.或者在模块化开发中,某些公共的模块是需要单独维护的,使用单独的仓库比较方便,但是在项目中需要引用,就会出现这样的场景.这里使用 Git 的 git submodule 命令为一个 git 项目 添加 子git项目. 可以使用 git submodule --help 查看所有相关命令. 为了方便说明,这

[Git] MAC上Git初探

1.基本设置,包括用户名.邮箱.编辑工具.查看设置.帮助等 $ git config --global user.name "John Doe" $ git config --global user.email [email protected] $ git config --global core.editor vim $ git config --list $ git help xxx(如config) 2.创建第一个Git库 $ git init 本地git维护由三棵树组成,Wo

git pull 与git fetch的区别

从百度上看到很多关于git fetch 和 git  pull 的不同 实践一下: 从github上新建一个项目try,copy到本地. 在github网站里修改readme.txt文件,新增加一句[alter readme] 在本地仓库的readme.txt也新增加一句,[add some thing] 现在想把本地代码提交到github上,是不能提交的.会出现错误提示!!! 应该先从远程仓库中把代码下载下来 (1)用git pull会怎么样呢? git pull origin master