“Git:子模块”的版本间差异
		
		
		
		
		
		跳到导航
		跳到搜索
		
				
		
		
	
| 第1行: | 第1行: | ||
[[category:Git]]  | [[category:Git]]  | ||
==   | == 添加submodule ==  | ||
关联项目子模块:  | |||
<syntaxhighlight lang="properties">  | |||
git submodule add https://github.com/test/subb.git modules/subb  | |||
</syntaxhighlight>  | |||
项目根目录下有一个.gitmodules文件,即子模块关联文件,如:  | 项目根目录下有一个.gitmodules文件,即子模块关联文件,如:  | ||
<syntaxhighlight lang="properties">  | <syntaxhighlight lang="properties">  | ||
| 第7行: | 第12行: | ||
     path = modules/suba  |      path = modules/suba  | ||
     url = https://github.com/test/suba.git  |      url = https://github.com/test/suba.git  | ||
</syntaxhighlight>  | </syntaxhighlight>  | ||
每添加一个子模块就会新增一条记录,如果是第一次添加Git子模块会自动生成。  | 每添加一个子模块就会新增一条记录,如果是第一次添加Git子模块会自动生成。  | ||
2020年10月14日 (三) 03:54的版本
添加submodule
关联项目子模块:
git submodule add https://github.com/test/subb.git modules/subb
项目根目录下有一个.gitmodules文件,即子模块关联文件,如:
[submodule "modules/suba"]
    path = modules/suba
    url = https://github.com/test/suba.git
每添加一个子模块就会新增一条记录,如果是第一次添加Git子模块会自动生成。
拉取submodule
当一个 git 项目包含子模块(submodule) 时,直接克隆下来的子模块目录里面是空的。有两种方法解决:
- 如果项目已经克隆到了本地,执行下面的步骤:
- 初始化本地子模块配置文件:
git submodule init
 - 更新项目,抓取子模块内容:
git submodule update
 
 - 初始化本地子模块配置文件:
 - 对于未克隆项目,使用“--recursive”参数,可以自动初始化并更新每一个子模块。
git clone --recursive 仓库地址
 
Note:
- 对于仓库首次拉取模块,可以使用:
git submodule update --init --recursive
 - 更新子模块
# (适用于git 1.8.2及以上版本) git submodule update --recursive --remote #(适用于git 1.7.3及以上版本) git submodule update --recursive # 或者 git pull --recurse-submodules
 
编辑submodule
切换子模块到开发分支,如:
cd modules/subb/
git checkout -b feature/some-change origin/dev
进行修改
推送submodule
推送子模块修改到远程,如:
git commit -am 'test commit submodule'
git checkout dev
git merge feature/some-change
git push origin dev
git branch -d feature/some-change
提交子模块修改之后,主项目会有一些修改:
cd ../../
git diff
>   diff --git a/subb b/subb
    index 433859c..b78179a 160000
    --- a/subb
    +++ b/subb
    @@ -1 +1 @@
    -Subproject commit 433859c90e539d2a1b9fda27b32bef0d0acae9e6
    +Subproject commit b78179adab252a524ff2a41d6407a7daa6dad34f
此时需要提交主项目该修改,才能在其他用户使用git submodule update时拉取新的代码:
git commit -am "test commit submodule"
git push origin dev
删除submodule
git没有直接删除子模块的命令,所以只能逐步删除相关文件。
- 在版本控制中删除子模块:
git rm -r modules/subb
 - 在编辑器中删除如下相关内容,也可以使用命令“vi .gitmodules”在vim中删除:
[submodule "modules/subb"] path = modules/subb url = https://github.com/test/subb.git branch = dev
 - 在编辑器中删除如下相关内容,也可以使用命令“vim .git/config”在vim中删除:
[submodule "modules/subb"] path = modules/subb url = https://github.com/test/subb.git active = true
 - 删除.git下的缓存模块:
rm -rf .git/modules/subb
 - 提交修改:
git commit -am "delete subb" git push origin dev