详解git submodule使用以及注意事项_其它综合

来源:脚本之家  责任编辑:小易  

一、Ubuntu系统默认内置:实际2113上ubuntu默认没有安装老版本的5261vi,只装了4102vim。vi是vim.tiny(vim的最小化版本,不含1653 GUI,并且仅含有一小部分功能,并且默认与vi兼容。此软件包不依赖于vim-runtime软件包)的一个别名,可用命令ls -l /usr/bin/vi来进行查看vi是指向/etc/alternatives/vi,而/etc/alternatives/vi 又指向/usr/bin/vim.tiny,从命令update-alternatives --display vi可以看出默认情况下,vi当前指向的是vim.tiny。二、VIM版本及其对比:不同的编译选项编译出来的vim而已。比如vim是终端下的vim-basic跟vim-tiny,而vim-gnome是用了GNOME2 GUI的vim,在gnome桌面系统上推荐安装vim-gnome。1、vim-tiny是tiny 版本的vim,就是功能比较少(前面有个+的表示有着功能),但是体积小,速度快。1、vim-tiny是tiny 版本的vim,就是功能比较少(前面有个+的表示有着功能),但是体积小,速度快。2、vim-basic:完整版的vim,不过同样没有图形界面,没有菜单3、更多可以查看帮助文档:http://vimdoc.sourceforge.net/htmldoc/various.html#+feature-list三、VIM安装:默认已经安装了VIM-tiny,下面我们以Ubuntu14.04(Unity)安装完整版VIM(VIM-basic)为例:在终端输入以下命令,则会自动安装:sudo apt-get install vim-basic安装完成后,发现系统会自动把默认的vi版本从tiny改成basic版本:此时vim-basic已经安装完毕现在系统有两个版本的VIM,可以如下命令查看:下面我们以Ubuntu14.04(Gnome3桌面)安装完整版VIM(VIM-gnome)为例:自动安装完之后,可以使用以下命令进行查看:已经添加到系统查看版本四、VIM配置:注:只对各个用户在自己的当前目录下的.vimrc修改的话,修改内容只对本用户有效,要想全部有效,可以修改/etc/vim/vimrc.    在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号、语法高亮度显示、智能缩进等功能的。为了更好的在vim下进行工作,需要手动设置一个配置文件:.vimrc。   启动vim时,当前用户根目录下的.vimrc文件会被自动读取,该文件可以包含一些设置甚至脚本,所以,一般情况下把.vimrc文件创建在当前用户的根目录下比较方便,即创建的命令为:$vi ~/.vimrc设置完后 $:x或者 $wq  进行保存退出即可。  下面给出一个例子,其中列出了经常用到的设置,详细的设置信息请参照参考资料:基本配置[1] [2]:"开启语法高亮 syntax on "依文件类型设置自动缩进 filetype indent plugin on   "显示当前的行号列号: set ruler "在状态栏显示正在输入的命令 set showcmd   "关闭/打开配对括号高亮 "NoMatchParen DoMatchParen行号的显示与隐藏[3]:"显示行号: set number "为方便复制,用<F2>开启/关闭行号显示: nnoremap <F2> :set nonumber!<CR>:set foldcolumn=0<CR>启用Modeline(即允许被编辑的文件以注释的形式设置Vim选项,详见Vim Wiki: Modeline magic)[4]:set modeline如果终端使用的是深色背景:"为深色背景调整配色 set background=dark下文的配置很多都依赖于第三方开发的 Vim 插件。为了方便地安装和维护这些插件,推荐先安装一种插件管理工具,目前较为流行的是 Vundle 和 pathogen。二者功能类似,但 Vundle 的配置更灵活, pathogen 则相对简洁。二者都能很好地与Git结合,安装插件十分方便。如果你使用 Git 管理你的配置文件,那么还可以将 Pathogen 或 Vundle 与 Git 的 Submodule 功能管理插件结合[5],使得在多台电脑间同步插件及在本地更新插件变得十分便捷。# 在存放配置文件的主文件夹下,添加一个 submodule git submodule add https://github.com/gmarik/vundle.git .vim/bundle/vundle   # 用类似的办法添加多个插件后,以后升级插件只需: git submodule update   # 如果其它电脑 checkout 出配置文件后,要先: git submodule init插件管理工具无需通过系统的包管理系统安装,只要将需要的文件放在 ~/.vim/ 目录中即可。这样,一套配置文件也可以方便地用在多个不同的系统环境中。Vim 7已经内置了代码补全功能[6],补全操作可分为两种:Vim的补全菜单操作方式与一般IDE的方式不同,可加入如下设置[7]:"让Vim的补全菜单行为与一般IDE一致(参考VimTip1228) set completeopt+=longest   "离开插入模式后自动关闭预览窗口 autocmd InsertLeave * if pumvisible() == 0|pclose|endif   "回车即选中当前项 inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>"   "上下左右键的行为 inoremap <expr> <Down> pumvisible() ? "\<C-n>" : "\<Down>" inoremap <expr> <Up> pumvisible() ? "\<C-p>" : "\<Up>" inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>" inoremap <expr> <PageUp> pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"如需自动补全,可安装AutoComplPop插件,安装后如需在补全是显示文档(预览),可加入设置:let g:acp_completeoptPreview = 1经常要将一段代码注释掉或取消注释,而尤其对于某些只支持单行注释的语言来说,逐行加注释很麻烦,这时快速注释(或取消注释)代码的插件就显得很有用了。常见的注释管理插件为The NERD Commenter,默认支持多种语言,使用方法也很简单:只需在可视(V)模式中选择一段代码,按下\cc加逐行注释,\cu取消注释,\cm添加块注释。如有其它需求,也可考虑comments、EnhCommentify等插件。使用自动缩进可能需要设置,vim中对自动缩进的详细设置办法见Vim代码缩进设置。在不同的模式中调整缩进的方法不同:另外,= 可对选中的部分进行自动缩进;]p可以实现p的粘贴功能,并自动缩进。代码跳转类似于IDE中的Ctrl+点击功能。与代码补全类似,代码浏览工具亦可分为基于文本分析的和基于代码理解的两类。在命令模式下可直接使用下述指令:[8]该功能依赖于ctags工具。[9]安装好ctags后,在存放代码的文件夹运行即可生成一个描述代码结构的tags文件。提示:ctags的功能很强大,更详细的配置请参考其文档。建议在~/.vimrc中添加如下配置以使Vim在父目录中寻找tags文件[10]:set tags=tags;/设置好后,可在Vim中使用如下功能:Ctrl-]转至最佳匹配的相应Tag,Ctrl-T返回上一个匹配。如果有多个匹配,g Ctrl-]可显示所有备选的tags。如有需要,可互换Ctrl-]和g Ctrl-] [11]:"在普通和可视模式中,将<c-]>与g<c-]>互换 nnoremap <c-]> g<c-]> vnoremap <c-]> g<c-]>   nnoremap g<c-]> <c-]> vnoremap g<c-]> <c-]>使用:make可调用make命令编译程序,配合Vim内置的QuickFix功能,可以像IDE一样打开一个窗口展示编译错误和警告,通过它还可以方便地跳转到各编译错误的产生位置。常用的命令有:cw[indow](如有错误打开quickfix窗口)、:cn(跳到下一个错误)、:cp(跳到前一个错误)等,具体可:help quickfix。如果想在有错时自动打开quickfix窗口[12]:" 编译后,如有错误则打开quickfix窗口。(光标仍停留在源码窗口) " " 注意:需要开启netsting autocmd autocmd QuickFixCmdPost [^l]* nested cwindow autocmd QuickFixCmdPost l* nested lwindow默认情况下,:mak[e]会跳转到第一个错误,如果不想启用这个功能,请使用:make!。代码较长时可启用代码折叠功能,如按语法高亮元素折叠:set foldmethod=syntax "默认情况下不折叠 set foldlevel=99随后即可使用z系列命令管理代码折叠。如za会翻转当前位置的折叠状态,zA会递归翻转当前层所有代码的折叠状态等。当然也可以把功能键映射到za:map <F3> zaK 键可用于查看当前函数的文档。近来仍被积极维护的代码托管在 GitHub 上的插件[13]:www.zgxue.com防采集请勿采集本网。

一、背景

在平时的软件开发过程中常常会有这样的场景,自己负责的某个模块会依赖其他模块或者第三方的library。这时你自己的模块是一个独立的代码仓库,你想要实现这样一种功能,当你从你的模块的代码仓库里把代码拉到本地来的时候,能自动的将你依赖的模块或第三方库都拉到指定的目录当中去。

当然要实现这个功能的方法有很多,比如使用repo之类的工具,又比如如果你使用的是svn作为版本管理工具,那么你可以使用svn的external机制来引用第三方的project。

这里要说的是使用git作为版本管理工具的情况。

二、git submodule

其它的细枝末节就不再赘述了,咱直奔主题。

先来看具体用例:

目前有一个模块A,其代码仓库的地址为:projectA.git, 它需要引用另一个模块B, 其代码仓库的地址为:projectB.git。

假设模块A的本地目录为:projectA

希望引用模块B为模块A的子模块,其在模块A目录下的路径为: projectA/projectB

这里我们通过git 的submodule机制来实现。

比如在命令行里可以直接使用如下命令:

cd projectAgit 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.gitcd projectAgit submodule initgit 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使用内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

通常在项目中会抽取部2113分公共5261模块移植到其它项目,git submodule可以不用文件复制的方4102式来很好得解决1653这个问题在git仓库中建一个子目录在该目录下用git add git@xxxxxx.git来添加公共库而其它人用:git submodule initgit submodule update就可以把公共库更新下来了,开始使用子模块 我们将要演示如何在一个被分成一个主项目与几个子项目的项目上...你可以通过在 git submodule add 命令后面加上想要跟踪的项目 URL 来添加新的,开始使用子模块 我们将要演示如何在一个被分成一个主项目与几个子项目的项目上...你可以通过在 git submodule add 命令后面加上想要跟踪的项目 URL 来添加新的,开始使用子模块 我们将要演示如何在一个被分成一个主项目与几个子项目的项目上...你可以通过在 git submodule add 命令后面加上想要跟踪的项目 URL 来添加新的,通常2113在项目中会抽取部分公共模块移植到其它项5261目,git submodule可以不4102用文件复制的方式来很好得解1653决这个问题在git仓库中建一个子目录在该目录下用git add git@xxxxxx.git来添加公共库而其它人用:git submodule initgit submodule update就可以把公共库更新下来了内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • git中submodule子模块的添加、使用和删除的示例代码
  • git submodule使用完整教程(小结)
  • github代码常用指令(小结)
  • xxencode 编码,xx编码介绍、xxencode编码转换原理与算法
  • 微信支付--签名错误问题的解决方法
  • 8种类型极品程序员,不知你属于哪一种?
  • 分享下get和post的真正区别
  • 教你免费做一个属于自己稳定有效的图床-picgo
  • git 教程简单入门介绍
  • 详细介绍 进程、线程和协程的区别
  • git pull时冲突的几种解决方式(小结)
  • 2019-ncov 全国新型肺炎疫情每日动态趋势可视图
  • git submodule 怎么用
  • 关于Ubuntu虚机内git submodule的问题
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全javascriptasp.netphp编程ajax相关正则表达式asp编程jsp编程编程10000问css/htmlflex脚本加解密web2.0xml/rss网页编辑器相关技巧安全相关网页播放器其它综合dart首页git中submodule子模块的添加、使用和删除的示例代码git submodule使用完整教程(小结)github代码常用指令(小结)xxencode 编码,xx编码介绍、xxencode编码转换原理与算法微信支付--签名错误问题的解决方法8种类型极品程序员,不知你属于哪一种?分享下get和post的真正区别教你免费做一个属于自己稳定有效的图床-picgogit 教程简单入门介绍详细介绍 进程、线程和协程的区别git pull时冲突的几种解决方式(小结)2019-ncov 全国新型肺炎疫情每日动态趋势可视图最新idea2020注册码永久激活(激活intellij idea2020永久破解,亲测intellij idea激活码获取方法(i删除svn三种方法delsvn(windows+c/s和b/s两种架构的概念、区别和网址(url)支持的最大长度是多少intellij idea 2020最新注册码(亲5个linux平台程序员最爱的开发工url中斜杠/和反斜杠\的区别小结cnpm不是内部命令的解决方案:配置环境变微信报警 zabbix实现详解gbk字符编码(字符集)缺陷导致web安全漏wpf滑块控件(slider)的自定义样式开发人员一定要加入收藏夹的网站 推荐win10环境下使用hyper-v进行虚拟机创建的人工智能开发语言排行榜: 不死java, 不朽提示“处理url时服务器出错”和“http 50二维码的生成细节和原理简单实用的aixcoder智能编程助手开发插件
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved