详解gitsubmodule使⽤以及注意事项
⼀、背景
在平时的软件开发过程中常常会有这样的场景,⾃⼰负责的某个模块会依赖其他模块或者第三⽅的library。这时你⾃⼰的模块是⼀个独⽴的代码仓库,你想要实现这样⼀种功能,当你从你的模块的代码仓库⾥把代码拉到本地来的时候,能⾃动的将你依赖的模块或第三⽅库都拉到指定的⽬录当中去。
当然要实现这个功能的⽅法有很多,⽐如使⽤repo之类的⼯具,⼜⽐如如果你使⽤的是svn作为版本管理⼯具,那么你可以使⽤svn的external机制来引⽤第三⽅的project。
这⾥要说的是使⽤git作为版本管理⼯具的情况。
⼆、git submodule
其它的细枝末节就不再赘述了,咱直奔主题。
先来看具体⽤例:
⽬前有⼀个模块A,其代码仓库的地址为:projectA.git,它需要引⽤另⼀个模块B, 其代码仓库的地址为:projectB.git。
git使用详解假设模块A的本地⽬录为:projectA
希望引⽤模块B为模块A的⼦模块,其在模块A⽬录下的路径为: projectA/projectB
这⾥我们通过git 的submodule机制来实现。
⽐如在命令⾏⾥可以直接使⽤如下命令:
cd projectA
git submodule add projectB.git projectB
注:这个submodule的⼦⽬录指定时不能以 “/”结尾,⽐如上⾯的命令,就不能写成 projectB/ 这个样⼦。
就这么简单的⼀句git命令就可以搞定了,当然这还没完,运⾏完这个命令之后,在projectA⽬录执⾏git status命令,可以看到如下的结果:
这时需要使⽤git commit命令和git push命令,将添加模块B为模块A的⼦模块的结果push到模块A的代码仓库⾥⾯去。
三、git clone包含⼦模块的代码仓库
此时,就可以使⽤git clone命令来抓取模块A的代码仓库,但要同时抓取到⼦模块的仓库的话,还需要⼀些⽅法:
正常的使⽤git clone命令,然后再使⽤ git submodule init 和git submodule update来获取⼦模块
git clone projectA.git
cd projectA
git submodule init
git submodule update
其运⾏结果如下:
在使⽤git clone命令时,加上–recurse-submodules或–recursive 这样的递归参数
git clone --recursive projectA.git
其运⾏结果如下:
四、tortoisegit操作submodule
如果是使⽤tortoisegit的话,也可以使⽤图形化界⾯进⾏submodule的相关操作,如添加submodule就选择如下图所⽰的菜单:
添加⼦模块的界⾯⼤概就是下⾯这个样⼦:
这⾥和上⾯⼀样“path”⼀栏不能以”/”结尾。填写之后,点击OK,就会在主模块的⽬录下添加对应的⼦模块。
在clone时也是⼀样的,它既可以只是clone,然后⽤上⾯菜单中,Submodule Update 选项来抓取⼦模块的内容,也可以在clone时选择递归参数,如下所⽰:
五、忽略submodule中的修改或新增⽂件
我们引⽤第三⽅的project,⼤多数情况都是想以“只读”的⽅式引⽤,不关⼼第三⽅project抓取下来之后是不是被修改,或者是在其⽬录中添加了untracked的file,因为我们只是拉取第三⽅的project,⽽不会(往往时不能或不允许)对第三⽅project进⾏提交。
以上⾯的模块A和模块B的例⼦来说,如果模块A和模块B中都有进⾏修改,其结果可能就是如下这个样⼦:
这并不是我们想要的结果。⼀开始的时候我的想法是使⽤ .gitignore 来忽略submodule的修改,但是⽆法做到,后来经过⼀番搜索,终于到了解决良药。在添加了submodule之后,project的⽬录下回⽣成
⼀个.gitmodules⽂件,这个⽂件记录了⼦模块的路径和仓库地址等信息,如下图所⽰:
我们要做的就是在[submodule “projectB”]中添加⼀个ignore⼦项,这个ignore⼦项可以有上个可选的值,untracked, dirty和all,它们的意思分别是:
untracked :忽略在⼦模块B(也就是projectB⽬录)新添加的,未受版本控制内容
dirty :忽略对projectB⽬录下受版本控制的内容进⾏了修改
all :同时忽略untracked和dirty
这⾥我们先选择dirty(⾄少先保证不提交对⼦模块B的任何修改),其他的可以根据具体需求来进⾏选择。
添加ignore⼦项之后的.gitmodules⽂件的内容如下所⽰:
然后我们再使⽤git status查看,可以得到图下结果:
可以看出,之前 “modified: projectB(modified content)” 已经不见了,此时对修改后的.gitmodules⽂件进⾏commit和push,之后在查看status或做commit时就可以忽略掉对⼦模块B修改的部分了。
到此这篇关于详解git submodule使⽤以及注意事项的⽂章就介绍到这了,更多相关git submodule使⽤内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。