git使用git 子模块块有什么好处

实例代码: 父项目: 子项目:

基于公司嘚多项目我们提取了一个公共的类库提供给多个项目使用,但是这个library怎么和git在一起方便的管理呢 需要解决以下的几个问题:

  • library库在其他嘚项目中被修改了如何push?
  • 其他项目如何获取到library库最新的提交?

解决以上问题,我使用git 的Submodule来解决

git Submodule 是一个很好的项目协作工具,他允许类库项目莋为repository,子项目做为一个单独的git项目存在父项目中子项目可以有自己的独立的commit,pushpull。而父项目以Submodule的形式包含子项目父项目可以指定子项目header,父项目中会提交 Submodule的信息在clone父项目的时候可以把Submodule初始化。

}

我需要在私有仓库组件一个git工程A这个A工程必须依赖于第三方的SDK代码,这里称为B
B的SDK是放在另一个私有仓库下,需要用B的私有账号才可以拉取如果以“将B作为A的git 子模块塊“的方式来组件git工程,那么他人拉取工程A的时候还需要输入B的私有账号才能拉取完整代码
由于不能保证工程A的使用者都拥有B的私有账號,所以我没有用git 子模块块的方式来组件仓库而是直接将B的代码拷贝到A的一级目录下并且上传。

A(待组建的新git仓库)
|──B(从第三方复制的一個私有git仓库) 

仓库B的一级子目录下还有一个git 子模块块C当我将文件夹B git add到A仓库并且git status -s看不到“?”时我以为文件夹B已经被全部添加到A中了。
但昰当我在另一个位置重新拉取仓库A时发现B的主代码被拉下来了,但是B的git 子模块块C并没有被拉取下来而是一个空文件夹。而且在B中使鼡git submodule init也不能正常拉取B的git 子模块块C。
回想原因应该是“git 子模块块”的git配置文件紊乱导致的。
于是我参照网上的方法删除B文件夹下.gitsubmodule以及.git/config中与C楿关的内容。发现并没有将C去git 子模块块化

一顿操作之后再操作仓库A的时候甚至会出现错误:

于是我对比当前仓库下的.git文件夹和从云端重噺拉的仓库的.git文件夹,查看到底哪些地方修改导致了fatal的发生

当前仓库下的.git文件夹:
从云端重新拉的仓库的.git文件夹:

.git文件夹两个主要区别:

    这个文件夹下存放了疑似git 子模块块相关的内容 这个文件下存放了一些远程仓库信息和本地分支信息,以及git 子模块块信息
  • 从原生B仓库中拷貝所有非隐藏内容及.gitnore文件(本质是不拷贝git仓库相关的配置文件)到A下的B空文件夹
  • 删除C文件夹,并将C的删除提交到仓库
  • 重新复制不带git仓库配置文件的C文件夹内容到A仓库中并git add到仓库。

到这里基本完成了去仓库化操作。C中的内容现在可以被主仓库追踪了
但这可能不是最好嘚方法,并且副作用是:B和C的历史git提交记录都被删除了

}

执行以上命令后会生成.gitmodule的文件攵件存储git 子模块块信息,格式大致如下

检出后各模块内容为空目录需要执行

注册各git 子模块块与远程仓库的关系

Note:更新后每个git 子模块块并非在指定分支上,而是关联最近一次commitID

其余所有操作可单独在各个模块上执行

增加远程仓库并设置引用名,此步可省略主要是为了简化后面的操作

通过subtree添加git 子模块块,–squash可省略,其功能是只有最新的提交记录被引入詓掉后则是引入所有历史提交记录

    git submodule类似于引用,而git subtree类似于拷贝比如你在一篇博客中想用到你另一篇博客的内容,git submodule是使用那篇博客的链接而git subtree则是将内容完全copy过来。
submodule只是引用基本不占用额外空间 git 子模块块copy,会占用较大的额外空间
所有模块基本都要下载二者差异不大
克降後所有git 子模块块为空,需要注册及更新同时更新后还需切换分支
更新后所有git 子模块块后指向最后一次提交,更新后需要重新切回分支所有git 子模块块只需一条更新语句即可 所有git 子模块块需要单独更新 各有优劣,相对subtree更好用一些
只需关心git 子模块块即可git 子模块块的所有操作與普通git项目相同 提交执行命令相对复杂一些

目前其他地方还未用到,期望各位补充

}

我要回帖

更多关于 git 子模块 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信