git的submodule功能详解

gitsubmodule功能详解 html

1. 前言

项目的版本库在某些状况下须要引用其余版本库中的文件,例若有一套公用的代码库,能够被多个项目调用,这个公用代码库能直接放在某个项目的代码中,而是要独立为一个代码库,那么其余要调用公用的代码库该如何处理?分别把公用的代码库拷贝到各自的项目中会形成冗余,丢弃了公共代码库的维护历史,这些显示不是好的办法,如今要了解的git子模组(git submodule)就解决了这个问题。 git

Git 子模块功能容许你将一个Git仓库看成另一个Git仓库的子目录。这容许你克隆另一个仓库到你的项目中而且保持你的提交相对独立。 gitlab

2. 准备工做

首先须要两个版本库例如: spa

1) 一个公共的版本库(例如:libA.git) orm

git@gitlab.szreach.com:fengyang/liba.git htm

2) 一个引用公共版本库的主版本库(例如:super.git) 索引

git@gitlab.szreach.com:fengyang/super.git get

3. TortoiseGit上git submodule功能实现

1. 添加子模组的步骤

第一步:使用submodule add...添加子模组

在须要做添加子模组的Git版本库中右击,选择“TortoiseGit->Submodule Add...,在“Repository:”里面输入须要添加子模组的版本库路径,在“Path: it

中输入添加子模组存放的目录路径。以下图所示: io

此时查看须要添加子模组的Git工做区的目录结构。在根目录下多了一个.gitmodules文件,而且公共代码库被克隆到lib/lib_a目录下。

第二步:查看.gitmodules的内容

.gitmodules的内容记录着含子模组存放的目录路径及子模组版本库的路径

注:此时工做区还没有提交,完成提交后,子模组才算正式完成在须要做添加子模组的Git版本库创立

注:此主版本库(super.git)就变成了一个包含子模组的版本库。

2. 克隆带子模组的版本库的步骤

克隆带子模组的git库,并不能自动将子模组的版本库克隆出来,对于只关心项目自己的数据,而不关心项目引用的外部项目数据的用户,这个功能很是好,数据没有冗余并且克隆的速度也很快。

第一步:克隆super主版本库

在工做区中克隆主主版本库后,会发现子模组的版本库并无克隆,只有将存放子模组版本库的目录克隆下来了。

----:存放子模组版本库的目录路径

第二步:克隆子模组

若是须要克隆出子模组形式引用的外部库,首先须要执行Submodule Update操做。

在须要做克隆子模组的Git工做区中右击,选择“TortoiseGit->Submodule Update...,点击“OK”便可。

执行Submodule Update...操做后就会把子模组的版本库克隆下来。

3. 对主Git库工做区做commitcheckoutrevertpullpush等更改Git工做区内容的操做时,查看Submodule目录下内容的效果

1) 对主Git库工做区做commit操做

当在主Git库工做区中变动到达一个适当状态时,咱们须要将这些变动提交到Git库,做版本备份和跟踪。

方法:

在工做区内右击,选择“ Commit-> "当前分支名称”,在Commit窗口中,选择须要提交的变动path,填写提交说明,点击“Ok”。

结论:在主git工做区做commit操做,只是将主Git工做区的变动历史提交到主Git本地库中,对Submodule没有任何影响。

2) 对主Git库工做区做checkout操做

当在主Git库工做区中想要切换到其余某个分支、某个tag、某个commit历史记录。

咱们这里举个特殊的例子:

切换到某个commit历史记录(如在主版本库中提交子版本库的历史记录)

方法:

Git工做区内的某目录上右击,选择“Swicht/Checkout...”在Swicht/Checkout...Checkout窗口中,在Switch to Commmit中列出须要切换的commit历史记录,在此列表中选择须要切换到的commit历史记录,之后点击“Ok”按钮。

注:因为切换到的是在主版本库中提交子版本库的那条历史记录,所以子模组中状态也会改换,也须要在子模组中执行切换。

执行Submodule Update操做便可。

3) 对主Git库工做区做revert操做

当在主Git库工做区中此次变动有错误时,就可使用revert操做来撤销此次次操做

方法:

在工做区内右击,选择“Revert”,在Revert窗口中,选择须要撤销的变动path,点击“Ok”。

结论:在主git工做区做revert操做,只是将主Git工做区某次的变动操做给撤销,这次操做以前的commit都会被保留,且对Submodule没有任何影响。

4) 对主Git库工做区做push操做

当在主Git库工做区中将主Git本地库的数据推送到主Git远程库中

方法:在工做区的目录上(不要在文件上)右击,选择“Git Sync...

"Local Branch""Remote Branch",“Remote URL”这3栏必须正确才能“推”数据。

结论:在主git工做区做push操做,只是将主Git本地库的变动历史推送到到主Git远程库中,对Submodule没有任何影响。

5) 对主Git库工做区做pull操做

当在主Git库工做区中将主Git远程库的拉取到主Git本地库中

方法:在工做区的目录上(不要在文件上)右击,选择“Git Sync...

"Local Branch""Remote Branch",“Remote URL”这3栏必须正确才能“拉”数据。

结论:在主git工做区做pull操做,只是将主Git远程库的变动历史拉取到到主Git本地库中,对Submodule没有任何影响。

4. submodule下的内容进行修改后commitpush,对submodule目录做pull

在执行Submodule Update...操做更新出子模组后,都以某个具体的提交版本进行检出,进入子模组目录,会发现其处于非跟踪状态。

显然这种状况下,若是修改lib/lib_a下的文件,提交就会丢失。下面介绍如何在检查的子模组中修改,以及如何更新子模组。

在子模组中切换到master分支(或者其余想要修改的分支)后在进行修改。

l 切换到master分支,而后在工做区作一些改动。

l 执行commit后,而且推送到子模组库中后。

l 回到主版本库中。

在主版本库中查看状态,在主版本库中能够看到子模组已修改,包含了更新的提交。

l 须要将修改提交在主版本库中进行推送。

submodule目录做pull

当子模组版本库中有新的提交历史记录,就须要作pull操做来更新。

注:对子模组库中作了pull操做,同时须要对调用子模组库的主版本库中也要作Pull操做。

以下图所示:

注意:进入子模组目录,会发现其处于非跟踪状态。显然这种状况下,若是修改lib/lib_a下的文件,提交就会丢失。提示以下:

5. 移除Submodule

第一步:用Delete(keep local) 将目录或文件命令从git的索引库中移除子模块目录

方法:

在工做区内目录或文件上右击,选择“Delete(keep local)”,在Delete窗口中,点击“Remove”。

Delete(keep local)把目录lib/git的索引库中移除,可是对目录lib/自己并不进行任何操做。

所以须要完全删除。

第二步:删除物理文件

第三步:删除.gitmodule文件

第四步:删除.git/configsubmodule配置源文件

删除以下图所示红框的部门

第五步:删除后,提交更改

 

 

http://www.kafeitu.me/git/2012/03/27/git-submodule.html
相关文章
相关标签/搜索