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
选项,就会在拉取的时候自动初始化并更新仓库中的每一个子模块
就先说这么多,溜了