Git子模块

发布时间 2024-01-05 13:03:15作者: xyfyy

Git子模块

现有仓库中加入子模块

# 现有仓库中添加新的子模块
git submodule add git://github.com/chneukirchen/rack.git rack
# 执行结束后,在项目中会有一个rock子目录,其中就是我们新增加的子模块
# 同时当前项目中会有一个.gitmodules文件,该文件配置了项目的url和本地的子目录
# example
[submodule "rack"]
      path = rack
      url = git://github.com/chneukirchen/rack.git

克隆含子模块的仓库

# 克隆项目
git clone git://github.com/chneukirchen/rack.git
# 初始化子模块
git submodule init
# 更新子模块
git submodule update

子模块使用场景

#当另一个开发者变更了rack的代码并提交,然后拉取提交后的代码。归并来的并不是子模块代码,而是个指向你的子模块的指针。此时,为了使子模块一致,需要执行
git submodule update

# 当另一个开发者对子模块进行了本地修改,但是本地修改没有推送到远程仓库,然后就提交了一个mr,这个mr会包含一个指针,指向的是这位开发者的本地子模块。当其它开发者视图拉取,运行update,子模块系统会找不到引用的提交(因为子模块此时还在另一位开发者的本地)。此时,会出现下面的错误:
fatal: reference isn’t a tree: 6c5e70b984a60b3cecd395edd5b48a7575bf58e0
Unable to checkout '6c5e70b984a60b3cecd395edd5ba7575bf58e0' in submodule path 'rack'
# 解决方法:查看git log,看看是谁最后变更了子模块的指针。然后当面沟通即可。