23.2 克隆带子模组的版本库

之前的表23-1在对比Subversion的svn:externals属性和Git子模组实现差异时,提到过克隆带子模组的Git库,并不能自动将子模组的版本库克隆出来。对于只关心项目本身的数据,而不关心项目引用的外部项目数据的用户,这个功能非常好,数据没有冗余而且克隆的速度也更快。

下面在另外的位置克隆super版本库,会发现lib/lib_a和lib/lib_b并未克隆。


$git clone/path/to/repos/super.git/path/to/my/workspace/super-clone

$cd/path/to/my/workspace/super-clone

$ls-aF

./../.git/.gitmodules lib/

$find lib

lib

lib/lib_a

lib/lib_b


这时如果运行git submodule status可以查看到子模组的状态。


$git submodule status

-126b18153583d9bee4562f9af6b9706d2e104016 lib/lib_a

-3b52a710068edc070e3a386a6efcbdf28bf1bed5 lib/lib_b


可以看到,每个子模组的目录前面都是40位的提交ID,最前面的是一个减号。减号的含义是该子模组尚未检出。

如果需要克隆出子模组形式引用的外部库,首先需要执行git submodule init。


$git submodule init

Submodule 'lib/lib_a' (/path/to/repos/libA.git)registered for path 'lib/lib_a'

Submodule 'lib/lib_b' (/path/to/repos/libB.git)registered for path 'lib/lib_b'


执行git submodule init实际上修改了.git/config文件,对子模组进行了注册。文件.git/config的修改示例如下(以加号开始的行代表新增的行)。


[core]

repositoryformatversion=0

filemode=true

bare=false

logallrefupdates=true

[remote"origin"]

fetch=+refs/heads/:refs/remotes/origin/

url=/path/to/repos/super.git

[branch "master"]

remote=origin

merge=refs/heads/master

+[submodule "lib/lib_a"]

+url=/path/to/repos/libA.git

+[submodule "lib/lib_b"]

+url=/path/to/repos/libB.git


然后执行git submodule update完成子模组版本库的克隆。


$git submodule update

Initialized empty Git repository in

/path/to/my/workspace/super-clone/lib/lib_a/.git/

Submodule path 'lib/lib_a':checked out

'126b18153583d9bee4562f9af6b9706d2e104016'

Initialized empty Git repository in

/path/to/my/workspace/super-clone/lib/lib_b/.git/

Submodule path 'lib/lib_b':checked out

'3b52a710068edc070e3a386a6efcbdf28bf1bed5'