zoukankan      html  css  js  c++  java
  • 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 git@github.com:kvnsmth/AFNetworking.git AFNetworking:critical-bug-fix
    或
    git subtree push -P lib  librepo master

    拉取引用库的最新代码

    git subtree pull --prefix=Vendor/AFNetworking --squash git@github.com:AFNetworking/AFNetworking.git master
    或
    git subtree pull -P lib librepo master

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

  • 相关阅读:
    告别ThinkPHP6的异常页面, 让我们来拥抱whoops吧
    ThinkPHP6 上传图片代码demo
    【ThinkPHP6:从TP3升级到放弃】1. 前言及准备工作
    PHP数字金额转换大写金额
    提高PHP开发效率, PhpStorm必装的几款插件
    5分钟弄懂Docker!
    GitHub 上排名前 100 的 IOS 开源库简介
    GitHub 上排名前 100 的 Android 开源库简介
    android线程消息传递机制——Looper,Handler,Message
    Android Activity:四种启动模式,Intent Flags和任务栈
  • 原文地址:https://www.cnblogs.com/pixy/p/4987873.html
Copyright © 2011-2022 走看看