相信任何开发,都会遇到一种状况。在作不一样的项目,可是又都会使用到一些经常使用的方法_组件_代码块等等。 做为一个追求优雅的开发人员,确定不能接受一段代码处处复制粘贴的操做。并且一旦这段代码往后须要更新,处处粘贴的话就须要全局搜索而后含泪修改了。 那么有没有一种办法,可以做为一些公共代码的“栖息地”,能够作到一处编写,处处使用呢?git
答案是有的。github
通过在知名404网站上一番搜寻,找到了Git内置的一个功能:submodule。bash
有种状况咱们常常会遇到:某个工做中的项目须要包含并使用另外一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 如今问题来了:你想要把它们当作两个独立的项目,同时又想在一个项目中使用另外一个。函数
Git 经过子模块来解决这个问题。 子模块容许你将一个 Git 仓库做为另外一个 Git 仓库的子目录。 它能让你将另外一个仓库克隆到本身的项目中,同时还保持提交的独立。工具
# 直接clone,会在当前目录生成一个someSubmodule目录存放仓库内容
git submodule add https://github.com/chaconinc/someSubmodule
# 指定文件目录
git submodule add https://github.com/chaconinc/someSubmodule src/submodulePath
复制代码
新增成功以后,运行git status
会在父仓库发现增长了2个变化fetch
展开说说:网站
什么是.submodules .submodules是记录当前项目的子模块配置的文件,里面保存了项目 URL 与已经拉取的本地目录之间的映射。ui
子模块目录 在新增完子模块以后,执行git status
以后,会看到相似下面的信息spa
$ git diff --cached someSubmodule
diff --git a/someSubmodule b/someSubmodule
# 重点是下面这行的 160000
new file mode 160000
index 0000000..c3f01dc
--- /dev/null
+++ b/DbConnector
@@ -0,0 +1 @@
+Subproject commit c3f01dc8862123d317dd46284b05b6892c7b29bc
复制代码
虽然someSubmodule是父仓库里面的一个目录,可是Git并不会列出里面全部的变化,而是会当作一个特殊的提交。 PS:160000模式。 这是 Git 中的一种特殊模式,它本质上意味着你是将一次提交记做一项目录记录的,而非将它记录成一个子目录或者一个文件。3d
正常clone包含子模块的函数以后,因为.submodule文件的存在someSubmodule已经自动生成。可是里面是空的。还须要执行2个命令。
# 用来初始化本地配置文件
git submodule init
# 从该项目中抓取全部数据并检出父项目中列出的合适的提交(指定的提交)。
git submodule update
------------------更好的方式---------------------
# clone 父仓库的时候加上 --recursive,会自动初始化并更新仓库中的每个子模块
git clone --recursive https://github.com/chaconinc/MainProject
复制代码
当一个项目里面包含子模块的时候,不只仅须要对父仓库进行版本管理,子模块目录下也是存在版本的。那在不一样的父仓库下面如何进行子模块的版本管理也成为新的问题。
最简单的办法,就是主项目只专一使用子模块的master分支上的版本,而不使用子模块内部的任何分支版本。
操做以下:
cd submodulePath
git fetch
git merge origin/master
复制代码
此时在主项目就能看到submodule目录已经更新了。 固然这也操做有点不方便,下面是更简便的方法:
# Git 将会进入子模块而后抓取并更新,默认更新master分支
git submodule update --remote
复制代码
若是须要更新其余分支的话,须要另外配置。
# 将git submodule update --remote 的分支设置为stable分支
git config -f .gitmodules submodule.DbConnector.branch stable
复制代码
未完待续
参考文档: