使用 Git 子模块从另一个 Git 存储库引用一个 Git 存储库
介绍
当代码项目的范围变大时,它通常依赖于其他团队或个人编写的外部代码。有几种方法可以将外部代码合并到您自己的存储库中。上一个指南从另一个 Git 存储库引用一个 Git 存储库介绍了如何使用git subtree命令将一个或多个存储库嵌套在另一个存储库中。使用Git 子模块是将一个存储库的快照合并到另一个存储库中的另一种方法。它可以帮助您保持这些存储库同步,而无需繁琐且容易出错的复制粘贴。
本指南介绍使用 Git 子模块的替代方法,并讨论如何使用它们执行一些常见操作。
点文件示例用例
本指南将使用在从另一个 Git 存储库引用一个 Git 存储库中讨论的相同点文件示例存储库来说明该主题。
设置存储库
要开始使用git submodules,请通过创建文件夹并提交来以通常的方式初始化存储库。
cd ~
mkdir dotfiles
cd dotfiles
git init
touch readme.md
git add . && git commit -m "initial commit"
使用 Git 子模块添加 VIM 插件
创建根或父存储库后,我们可以开始使用git submodule命令引用其他存储库。
运行以下命令:
git submodule add git@github.com:tpope/vim-dispatch.git vim/pack/start/dispatch -b main
此命令添加子模块并在根存储库中创建一个新的vim文件夹。它类似于git subtree命令,您可以在其中指定要克隆的远程存储库、要保存的位置以及要跟踪的分支。
但是,与git 子树不同的是,在根目录下还创建了一个新的.gitmodules文件。其内容显示如下。它是本地子模块位置与其远程存储库之间的映射文件。
submodule "vim/pack/start/dispatch"]
path = vim/pack/start/dispatch
url = git@github.com:tpope/vim-dispatch.git
这些更改不会自动提交,因此您必须单独提交它们。
git add .
git commit -m "added vim dispatch submodule"
更新 Git 子模块
当你想要嵌套的存储库更新了新功能和错误修复时,你会希望将它们合并到你的点文件中。子模块相对于子树的一个小优点是更新一个或多个存储库更简单。
使用子模块,您可以使用一个命令自动更新所有嵌套的存储库。
git submodule update --remote --merge
这将遍历您的.gitmodules文件并提取指定跟踪分支的最新提交。如果有更新,它们将不会提交到存储库。这很有用,因为它让您有机会在提交到您自己的存储库之前测试新代码。
相反,使用git subtree时,您需要为每个嵌套存储库运行git subtree pull命令或手动设置脚本来执行此操作。如果您有多个嵌套存储库,这可能会很繁琐。
初始化 Git 子模块
最后,当您切换计算机时,您将需要将点文件存储库克隆到它们上,并且您还需要子模块。但是,要做到这一点,您需要运行其他命令或传递单独的标志。git clone [repo]是不够的。
如果您尚未克隆您的存储库,请记得指定--recursive标志:
git clone --recursive git@github.com:chinwobble/dotfiles.git
如果存储库已被克隆,请运行git submodule update命令:
git submodule update --init --recursive
这是git submodules的主要缺点之一。它要求存储库的其他用户执行他们通常不需要执行的额外操作。
结论
Git 子模块是利用 Git 作为外部依赖管理工具的另一种方式。对于您的团队来说,子模块比git subtree有额外的学习曲线,因此考虑您的项目是否真的需要它们很重要。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~