Git 中一个类似 Composer 的工具 – 子模块

Composer 对于做 PHP 开发的人来说一定不陌生,也极大的方便了日常开发工作,找到合适的包直接加载一下就可以使用

对于 Git 中的一个工具你了解过吗,在工作中的项目可能需要包含另外一个项目,也许是一个第三方库,也许是你自己开发的一个私有库

说到第三方库一定会想到使用 Composer 去加载,使用 Composer 加载你在部署的时候要确保每一个客户端都包含这个库

如果将代码复制到自己的项目中,那么你做的任何自定义修改都会在合并的时候变得困难

Git 通过子模块来解决了这个问题。子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录,它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立

开始使用子模块

在已存在的仓库中添加子模块,可以使用git submodule add命令,比如这样

$ git submodule add git@github.com:sy-records/GetIP.git

默认情况下,子模块会将子项目放到一个与仓库同名的目录中,本例中是 “GetIP”。 如果你想要放到其他地方,那么可以在命令结尾添加一个不同的路径

查看一下状态会发现:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        new file:   .gitmodules
        new file:   GetIP

多出了一个.gitmodules文件

这个配置文件是保存了项目的URL和本地目录之间的映射关系

$ cat .gitmodules
[submodule "GetIP"]
        path = GetIP
        url = git@github.com:sy-records/GetIP.git

如果有多个子模块,这个文件中就会有多条记录,它会和该项目的其他部分一同被拉取推送,这就是克隆该项目的人知道去哪获得子模块的原因

克隆含有子模块的项目

还跟平常克隆项目一样git clone的命令

$ git clone git@github.com:sy-records/git-submodule.git

然后你就会发现,克隆下来的子模块文件夹是空的,没有代码

是因为包含子模块的项目不仅仅克隆下来就可以了,需要运行两个命令:

git submodule init用来初始化本地配置文件

git submodule update从该项目中抓取所有数据并检出父项目中列出的合适的提交

$ git submodule init
Submodule 'GetFavicon' (git@github.com:sy-records/GetFavicon.git) registered for path 'GetFavicon'
Submodule 'GetIP' (git@github.com:sy-records/GetIP.git) registered for path 'GetIP'

$ git submodule update
Cloning into 'F:/Test/git-submodule/GetFavicon'...
Cloning into 'F:/Test/git-submodule/GetIP'...
Submodule path 'GetFavicon': checked out '2808acdbbfa08579460e5edc9f26bce49c8a66a9'
Submodule path 'GetIP': checked out '48be97908b62fb9a8c3623feb67f45e3c7a484f0'

或者在克隆的时候加上--recursive选项,就会在拉取的时候自动初始化并更新仓库中的每一个子模块

就先说这么多,溜了 🙄

2 条评论

发表评论

*