git项目中的子git项目

如果您从事开源开发,则可能与Git一起管理源代码。 您可能遇到过具有大量依赖项和/或子项目的项目。 您如何管理它们?

对于开源组织,为社区产品实现单源文档和依赖性管理可能很棘手。 文档和项目通常最终都是零散的和多余的,这使得它们难以维护。

需要

Git子模块和子树

如果您可以使用一个命令将一个项目放在另一个项目中怎么办? 如果您可以将子项目添加到任意数量的项目中,并随时随地推动更改,该怎么办? Git为此提供了解决方案:Git子模块和Git子树。 创建这些工具是为了在更高模块级别上支持代码共享开发工作流,以期弥合Git存储库的源代码管理(SCM)与其中的子存储库之间的鸿沟。

桑树上生长的樱桃树

这是本文将详细介绍的概念的真实场景。 如果您已经熟悉树木,则此模型如下所示:

CC BY-SA opensource.com

什么是Git子模块?

Git在其默认包中提供了子模块,这些子模块使Git存储库可以嵌套在其他存储库中。 确切地说,Git子模块指向子存储库上的特定提交。 这是我的文档测试 GitHub存储库中的Git子模块:

格式folder @ commitId表示存储库是一个子模块,您可以直接单击该文件夹以转到子存储库。 名为.gitmodules的配置文件包含所有子模块存储库详细信息。 我的仓库.gitmodules文件看起来像这样:

您可以使用以下命令在存储库中使用Git子模块。

克隆存储库并加载子模块

要克隆包含子模块的存储库:

 $  git clone --recursive < URL to Git repo > 

如果您已经克隆了存储库并想要加载其子模块:

 $  git submodule update --init 

如果存在嵌套的子模块:

 $  git submodule update --init --recursive 

下载子模块

顺序下载子模块可能是一项繁琐的任务,因此克隆子模块更新将支持--jobs-j参数。

例如,要一次下载八个子模块,请使用:

$ git submodule update --init --recursive -j 8
$ git clone --recursive --jobs 8 < URL to Git repo >

拉子模块

在运行或构建父存储库之前,必须确保子依赖项是最新的。

要提取子模块中的所有更改:

 $  git submodule update --remote 

使用子模块创建存储库

要将子存储库添加到父存储库:

 $  git submodule add < URL to Git repo > 

初始化现有的Git子模块:

 $  git submodule init 

您还可以通过在子模块update命令中添加--update来在子模块中创建分支并跟踪提交:

 $  git submodule update --remote 

更新子模块提交

如上所述,子模块是指向子存储库中特定提交的链接。 如果您要更新子模块的提交,请不要​​担心。 您无需显式指定最新提交。 您可以只使用常规子模块更新命令:

 $  git submodule update 

只需像往常一样添加和提交即可创建父存储库并将其推送到GitHub。

从父存储库中删除子模块

仅手动删除子项目文件夹不会从父存储库中删除子项目。 要删除名为childmodule的子模块,请使用:

 $  git rm -f childmodule 

尽管Git子模块看起来很容易使用,但对于初学者来说可能很难找到解决方法。

什么是Git子树?

Git 1.7.11中引入的Git子树允许您将任何存储库的副本作为另一个存储库的子目录插入。 这是Git项目可以注入和管理项目依赖项的几种方式之一。 它将外部依赖项存储在常规提交中。 Git子树提供了干净的集成点,因此它们更易于还原。

如果使用GitHub提供的子树教程来使用子树,则 每次添加子 树时,都不会 在本地 看到 .gittrees 配置文件。 这使得难以识别子树,因为子树看起来像常规文件夹,但它们是子存储库的副本。 带有 .gittrees 配置文件 的Git子树的版本 在默认的Git软件包中不可用,因此要获取带有 .gittrees 配置文件 的git-subtree ,必须从 Git源代码中 的 / contrib / subtree 文件夹 下载git-subtree。 资料库。

您可以克隆任何包含子树的存储库,就像其他任何常规存储库一样,但是可能会花费更长的时间,因为子存储库的整个副本都位于父存储库中。

您可以使用以下命令在存储库中使用Git子树。

将子树添加到父存储库

要将新的子树添加到父存储库,您首先需要远程添加它,然后运行subtree add命令,例如:

$ git remote add remote-name < URL to Git repo >
$ git subtree add --prefix =folder / remote-name < URL to Git repo > subtree-branchname

这会将整个子项目的提交历史合并到父存储库中。

将更改推入和拉出子树

 $  git subtree push-all 

要么

 $  git subtree pull-all 

您应该使用哪个?

每个工具都有优点和缺点。 这里有一些功能可以帮助您确定最适合您的用例的功能。

  • Git子模块具有较小的存储库大小,因为它们只是指向子项目中特定提交的链接,而Git子树包含整个子项目及其历史记录。
  • Git子模块需要在服务器中可访问,但是子树是分散的。
  • Git子模块主要用于基于组件的开发中,而Git子树则用于基于系统的开发中。

Git子树不是Git子模块的直接替代。 有一些注意事项可以指导每种方法的使用位置。 如果您拥有一个外部存储库,并且有可能将代码推送回去,请使用Git子模块,因为它更易于推送。 如果您有不太可能推送的第三方代码,请使用Git子树,因为它更容易提取。

尝试一下Git子树和子模块,让我知道它在注释中的表现。

翻译自: https://opensource.com/article/20/5/git-submodules-subtrees

git项目中的子git项目

git项目中的子git项目_使用子模块和子树管理Git项目相关推荐

  1. “IBP在城市大脑项目中的应用”入选工信部2021年大数据产业发展试点示范项目名单

    9月1日,工业和信息化部公布了<2021年大数据产业发展试点示范项目名单>,浪潮云申报的"IBP在城市大脑项目中的应用"荣登榜单. "2021年大数据产业发展 ...

  2. android git提交整个项目_使用子模块和子树来管理 Git 项目 | Linux 中国

    使用子模块和子树来帮助你管理多个存储库中共有的子项目.https://linux.cn/article-12244-1.html作者:Manaswini Das译者:Xiaobin.Liu 如果你参与 ...

  3. git 上传项目到linux仓库_使用子模块和子树来管理 Git 项目 | Linux 中国

    使用子模块和子树来帮助你管理多个存储库中共有的子项目. 来源:https://linux.cn/article-12244-1.html 作者:Manaswini Das 译者:Xiaobin.Liu ...

  4. 第五届北大青鸟杯全国IT精英挑战赛华中区一等奖项目——中商百货分销系统_关键代码说明书

    第五届北大青鸟杯全国IT精英挑战赛华中区一等奖项目--中商百货分销系统 关键代码说明书 作者:武汉宏鹏田超凡 版权所有,转载请注明原作者,仿冒侵权必究法律责任 中商百货分销商城关键代码说明...... ...

  5. react项目中的参数解构_一天入门React学习心得

    一天入门React学习心得 阅读前必读 本文写的仓促,算是一个学习笔记吧,算是一个入门级的学习文章.如果你刚刚入门,那么可能一些入门的视频可能更加适合你.但如果具备一些知识,比如Vue,那么视频就不适 ...

  6. IntelliJ IDEA 如何知道项目中的模块数据_如何从项目源中选择模块加入当前项目中(添加模块)_如何移除项目中的模块(移除模块/删除模块)

    文章目录 IDEA 如何获取项目的模块数据 从项目源中选择模块加入当前项目中 如何移除项目中的模块 方式一,选择模块的根目录(Content Root),鼠标右键 Remove 方式二,打开[项目结构 ...

  7. 项目中的难点怎么克服_克服大型项目中的文档挑战

    项目中的难点怎么克服 鉴于最近熊猫( Pandas) ,NumPy和Matplotlib等开放源数据科学项目的普及Swift增长,人们对文档的兴趣日益浓厚 ,这不足为奇. 为了帮助您了解所面临的问题, ...

  8. 项目中最困难的部分_微服务最难的部分是什么? 您的资料

    项目中最困难的部分 在本文中,我将探讨创建和开发微服务时最棘手的问题:您的数据. 使用Spring Boot / Dropwizard / Docker并不意味着您在做微服务. 仔细查看您的域和数据将 ...

  9. gradle 项目打包成多个jar包_永不失优雅——高效管理Springboot项目

    猿灯塔 全文略长 希望能帮到各位 另外!文末有你们想要的白嫖惊喜哦! 本文主要讲述一下如何优雅地管理SpringBoot项目. 第一种方式:使用SHELL脚本 As we known 作为一个后端程序 ...

最新文章

  1. 和12岁小同志搞创客开发:Mind+编程软件简介、安装及使用
  2. WCDMA中的URA和LA/RA
  3. [BZOJ 1124][POI 2008] 枪战 Maf
  4. web第6次作业position
  5. jzoj1882-亲戚【并查集】
  6. 信号集操作函数,信号阻塞与未决
  7. 不使用for完成一段有空格间隔的字符串,分辨长度大于等于4的单词(求各位高人修改,我表示我是菜鸟,这个算法实在太长了)...
  8. 高斯积分公式matlab_数值微分与数值积分(一)
  9. 在网页中嵌入任意字体的解决方案---google在线字体库应用
  10. 强制打开BIOS中禁用的I/OAT DCA(二)
  11. 时间序列--平稳性介绍及检验方法
  12. 什么是激励函数?(代码+详细注释)
  13. 卸载office 2016 报错:错误1321
  14. MySQL简单技巧(三):教你轻松用information_schema表+python实现表结构同步(上)——理论篇
  15. 基于Prometheus的ego运动规划实现
  16. JavaWeb 注解
  17. 分析 BAT 互联网巨头在大数据方向布局及大数据未来发展趋势
  18. 如何用原生js获取非行间样式
  19. 今日恐慌与贪婪指数为25 等级转为极度恐慌
  20. Python实现主播人气排行榜,带你发现人气王

热门文章

  1. 小制作- -炫彩水晶钟 TOM搬家
  2. 换电脑怎么转移大量资料?新旧电脑数据转移?
  3. 德鲁克:激发我一生的七段经历
  4. 2010年:中国IC新一轮造福年
  5. 乌合之众——群体心理学
  6. MSTAR数据集下载
  7. 欢迎关注公众号:Kotlin开发者社区
  8. wpsword怎样涂黑方框_【wps文字怎样设置红色边框图解】 wps怎么给文字加边框
  9. 拆卸ThinkpadE470及内存槽信息
  10. Adobe收购的Figma,是如何发展起来的