博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
git项目中的子git项目_使用子模块和子树管理Git项目
阅读量:2535 次
发布时间:2019-05-11

本文共 2720 字,大约阅读时间需要 9 分钟。

git项目中的子git项目

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

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

需要

Git子模块和子树

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

Cherry tree growing on a mulberry tree

桑树上生长的樱桃树

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

Tree with subtrees

CC BY-SA opensource.com

什么是Git子模块?

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

Git submodules screenshot

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

Screenshot of .gitmodules file

您可以使用以下命令在存储库中使用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子树提供了干净的集成点,因此它们更易于还原。

如果使用的来使用子树,则 每次添加子 树时,都不会 在本地 看到 .gittrees 配置文件。 这使得难以识别子树,因为子树看起来像常规文件夹,但它们是子存储库的副本。 带有 .gittrees 配置文件 的Git子树的版本 在默认的Git软件包中不可用,因此要获取带有 .gittrees 配置文件 的git-subtree ,必须从 Git源代码中 的 下载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子树和子模块,让我知道它在注释中的表现。

翻译自:

git项目中的子git项目

转载地址:http://gdbzd.baihongyu.com/

你可能感兴趣的文章
【AUTO Uninstaller - 使用教程】Autodesk系列软件终极完美修复卸载工具【转载】
查看>>
项目管理5大过程9大知识域44个定义
查看>>
扩展easyui treegrid 级联选择
查看>>
[operator]ELK6 index pattern的问题
查看>>
广而告知
查看>>
HTML 自动刷新页面
查看>>
HTML基础3
查看>>
Microsoft NTLM
查看>>
在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求(转)
查看>>
代码自动生成工具版本更新,新增支持Arduino uno R3
查看>>
CSS list-style属性控制ul标签样式
查看>>
课堂小记---JavaScript(3)
查看>>
Python文件操作
查看>>
求解: Windows Phone XAML Controls 为什么是disable状态?
查看>>
【Codeforces 382C】Arithmetic Progression
查看>>
数据库练习
查看>>
JS面向对象编程之对象(简化版)
查看>>
yum与rpm常用选项
查看>>
Zabbix监控DB,Tomcat
查看>>
Python学习(2 数据运算)
查看>>