本文共 2720 字,大约阅读时间需要 9 分钟。
git项目中的子git项目
如果您从事开源开发,则可能与Git一起管理源代码。 您可能遇到过具有大量依赖项和/或子项目的项目。 您如何管理它们?
对于开源组织,为社区和产品实现单源文档和依赖性管理可能很棘手。 文档和项目通常最终都是零散的和多余的,这使得它们难以维护。
如果您可以使用一个命令将一个项目放在另一个项目中怎么办? 如果您可以将子项目添加到任意数量的项目中,并随时随地推动更改,该怎么办? Git为此提供了解决方案:Git子模块和Git子树。 创建这些工具是为了在更高模块级别上支持代码共享开发工作流,以期弥合Git存储库的源代码管理(SCM)与其中的子存储库之间的鸿沟。
这是本文将详细介绍的概念的真实场景。 如果您已经熟悉树木,则此模型如下所示:
Git在其默认包中提供了子模块,这些子模块使Git存储库可以嵌套在其他存储库中。 确切地说,Git子模块指向子存储库上的特定提交。 这是我的 GitHub存储库中的Git子模块:
格式表示存储库是一个子模块,您可以直接单击该文件夹以转到子存储库。 名为.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 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项目
转载地址:http://gdbzd.baihongyu.com/