设为首页 收藏本站
查看: 1083|回复: 0

[经验分享] Git subtree和Git submodule

[复制链接]

尚未签到

发表于 2018-1-15 19:10:21 | 显示全部楼层 |阅读模式
  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),快进的情况也会误报冲突,还需要手动解决冲突

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-435442-1-1.html 上篇帖子: Git设置及GitHub的使用 下篇帖子: python git的一些命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表