Git使用手册:submodule在协作开发中的应用

之前的这篇文章创建submodule讲到如何为Git仓库添加一个submodule,但在实际的企业开发中,一个项目的开发往往不是单独进行开发,而是处于多人协作进行开发的情况,可能在项目开发进行的途中还会突然加入新的开发伙伴,本篇博客主要是想记录一下,Git的submodule功能在这种企业开发环境下的一些运用。 场景1:当前企业正在开发Project1项目,Project1中除了自身源代码外还包含了一个名为CommonLib的submodule,此时,项目开发中途加入了两位新的开发人员(员工A和员工B),参与开发最首要的就是先搭建环境并获取当前项目的代码,才能投入开发状态。 首先,两位员工应该做的事情是获取当前Project1项目源代码,如何获取?当然不是简单的拷贝复制,而是使用如下命令,将Git服务器上的代码克隆回本地

git clone 远程仓库地址

由于项目中存在submodule,而submodule工程和主工程的代码是相对独立的,所以还需要进入Project1的目录下执行两行命令,将CommonLib这个submodule同步回Project1的工程下

git submodule init(初始化子模块)git submodule update(更新获取子模块的代码回本地)

到此新员工A和B已经获得Project1和CommonLib子模块的最新代码,可以愉快的进行开发了。

场景2:在加入Project1项目的开发后,某一天,新员工A发现了CommonLib的代码中存在一个BUG或者是发现一个新的功能在其他项目也需要被用到,此时需要改动CommonLib中的源代码。 首先,新员工A直接进入到CommonLib中进行源代码修改,如当前修改的就是lib文件夹下的lib.java文件

用命令查看会发现,当前窗口已经提示submodule被修改了,此时我们需要将submodule的修改进行提交同步的到远程的Git仓库

如果按照直接执行在Project1目录下执行git commit –am “相关描述”进行提交,对submodule发生的改变是没有任何作用的,因为这种提交方式只是提交当前Project1主工程的修改,对于submodule发生的改变不会进行提交

正确的提交方式先进入CommonLib子模块的目录先做如下操作

cd 子模块目录git commit –am “相关描述”(如果增删了文件,需要先做git add .操作)git rebase remotes/origin/master (同步服务器上的子模块代码)git push(提交子模块到远程库)cd 主工程目录git add 子模块目录(将子模块发生修改告诉你的主工程,这样他才能进行跟踪)git commit –am “相关描述”git push (提交主工程到远程库)

完成以上流程的操作,才算正确的提交了子模块的修改,并让主工程跟踪跟新子模块。

场景3:新员工A在更新的CommonLib的子模块后,其他一起开发Project1项目的人员(包括了新员工B)都都需要同步更新CommonLib中的代码。 此时新员工B需要执行如下的几个操作来

git pull (在主工程目录下同步更新代码)

git status(查看submodule是否发生了修改)

git submodule update(如果子模块发生修改,需要执行此操作进行更新)

如果子模块下还包含着子模块,最后一句的更新操作可以换成如下的命令

git submodule foreach git submodule update

实际上,submodule项目和它的父项目本质上是2个独立的git仓库。只是父项目存储了它依赖的submodule项目的版本号信息而已。如果其他同事更新了submodule,然后更新了父项目中依赖的版本号。你需要在git pull之后,调用 git submodule update来更新submodule信息。 有些时候你需要对submodule做一些修改,很常见的做法就是切到submodule的目录,然后做修改,然后commit和push。但是默认git submodule update并不会将submodule切到任何branch,所以,默认下submodule的HEAD是处于游离状态的(‘detached HEAD’state)。所以在修改前,记得一定要用git checkout master将当前的submodule分支切换到master,然后才能做修改和提交。 如果你不慎忘记切换到master分支,又做了提交,,可以用cherry-pick命令挽救。具体做法如下:

git log (获取当前在游离分支提交的commitid)

git checkout master(将HEAD从游离状态切换到 master 分支)git cherry-pick 游离分支上提交的commitID (将提交从游离分支放到master分支上)git push (将更新提交到远程版本库中)

场景4:如果你要在Project1主功能中删除CommonLib子模块 需要到主工程Project1目录,执行如下的一些清理操作

git rm –cached 子模块目录rm 子模块目录rm .git/modules/子模块目录

以上就是我对submodule开发应用的一些总结,如果有什么错误和不足,欢迎在下方留下你的评论。尊重原创,转载请注明本文出处

明天又会是新的一天,而我依然年轻。

Git使用手册:submodule在协作开发中的应用

相关文章:

你感兴趣的文章:

标签云: