Git Config 通常有三个配置文件范围,系统级:/etc/gitconfig
,用户级:$HOME/.gitconfig
,项目级:.git/config
。
它们的优先级分别是:系统级 < 用户级 < 项目级
。
如果我们需要根据不同项目配置不同的 Git 配置信息(如:用户、邮箱),一般就会在项目级去添加配置信息,如:git config user.name=xiaoming
(配置用户),git config user.email=xiaoming@company.com
(配置邮箱)。
但这样随之带来的问题就是如果我们有多个项目那么都需要在每个项目下面去进行这样的配置,这样显然是不方便的。在 Git 较新的版本中提供了 include
、includeIf
、gitdir
这几个关键字对一个范围的目录文件夹进行统一配置。
注: gitdir
关键字的使用要求 Git 的版本必须 >= v2.13.0
。
在 系统级
或 用户级
的 git config 文件中添加如下内容:
$HOME/.gitconfig
文件
1 | # 通过 gitdir 指定单独的 git 配置(git >= v2.13.0) |
注: 这里的 gitdir
值 ~/Work/xxx/
必须以 /
结尾,不然不能正常匹配 ~/Work/xxx
目录下的所有 Git 仓库。
这里的配置含义是: 在 ~/Work/xxx
目录下的所有 Git 仓库配置会追加 ~/Work/xxx/.gitconfig
文件中的配置信息(覆盖用户级和系统级相同的配置信息)。
其中 gitdir
、path
值可以根据你的实际情况替换。
然后我们在上面的 ~/Work/xxx/.gitconfig
文件中对 Git 的用户和邮箱进行单独的指定:
1 | [user] |
这样配置完成后只要是放置在 ~/Work/xxx
文件夹下面的 Git 项目 commit 时使用的用户就会都是 xiaoming 邮箱都是 xiaoming@company.com,通过这种方式指定 Git Config 配置就比针对每一个 Git 项目去单独配置要方便得多了。
注: 通过 gitdir
来指定 Git Config 配置的优先级别高于 用户级
配置,但低于 项目级
配置。
根据慕课网视频《玩转 Vim 从放弃到爱不释手》整理。地址:https://www.imooc.com/learn/1129
模式 | 命令 | 描述 |
---|---|---|
insert | <C-h> | 删除上一个字符 |
insert | <C-w> | 删除上一个单词 |
insert | <C-u> | 删除当前行 |
normal | gi | 快速跳转到最后编辑的位置并插入 |
模式 | 命令 | 描述 |
---|---|---|
normal | w 、W | 移到下一个 word/WORD 开头 |
normal | e 、E | 移到下一个 word/WORD 结尾 |
normal | b 、B | 回到上一个 word/WORD 开头 |
normal | f{char} | 移动到当前行 char 字符上 |
normal | t{char} | 移动到当前行 char 的前一个字符 |
normal | 0 | 移动到行首第一个字符 |
normal | ^ | 移动到第一个非空白字符 |
normal | $ | 移动到行尾 |
normal | g_ | 移动到行尾非空白字符 |
normal | ( 、) | 在句子间上下移动 |
normal | { 、} | 在段落间上下移动 |
normal | gg | 移动到文件开头 |
normal | G | 移动到文件结尾 |
normal | Ctrl+o | 快速返回到上一个位置 |
normal | H | 跳转到屏幕开头(Head) |
normal | M | 跳转到屏幕中间( Middle) |
normal | L | 跳转到屏幕结尾(Lower) |
normal | <C-u> | 向上翻页(upword) |
normal | <C-f> | 向下翻页(forward) |
normal | zt | 把当前行放置到屏幕顶部 |
normal | zz | 把当前行放置到屏幕中间 |
normal | zb | 把当前行放置到屏幕底部 |
normal | `^ | 快速跳转到最后编辑的位置 |
Tips:
f{char}
、f{char}
可以用 ;
、,
继续搜索该行上的下一个/上一个。:[rang] s[ubstitute]/{pattern}/{string}/[flags]
rang
:表示范围,比如:10,20
表示 10-20 行,%
表示全部。pattern
:表示要替换的模式(支持:正则)。string
:替换后的文本。flags
:替换标志位。g(global)
表示全局范围内执行;c(confirm)
表示确认,可以确认或拒绝修改;n(number)
报告匹配到的次数而不替换。Tips:
<
和 >
,如::% s/\<hello\>/world/g
,将所有的 hello 替换为 world。Buffer 缓冲区
模式 | 命令 | 描述 |
---|---|---|
command | :ls | 列举当前缓冲区 |
command | :b n | 跳转到第 n 个缓冲区 |
command | :bpre | 上一个缓冲区 |
command | :bnext | 下一个缓冲区 |
command | :bfirst | 第一个缓冲区 |
command | :blast | 最后一个缓冲区 |
command | :b buffer_name | 加上 Tab 补全来跳转 |
Window 窗口
模式 | 命令 | 描述 |
---|---|---|
normal | <C-w>s | 水平分割 |
command | :sp | 水平分割 |
normal | <C-w>v | 垂直分割 |
command | :vs | 垂直分割 |
normal | <C-w>w | 在窗口间循环切换 |
normal | <C-w>h | 切换到左边的窗口 |
normal | <C-w>j | 切换到下边的窗口 |
normal | <C-w>k | 切换到上边的窗口 |
normal | <C-w>l | 切换到右边的窗口 |
normal | <C-w>H | 将窗口移动到左边 |
normal | <C-w>J | 将窗口移动到下边 |
normal | <C-w>K | 将窗口移动到上边 |
normal | <C-w>L | 将窗口移动到右边 |
normal | <C-w>= | 使所有窗口等宽、等高 |
normal | <C-w>_ | 最大化活动窗口的高度 |
normal | <C-w> | | 最大化活动窗口的宽度 |
normal | [n]<C-w>_ | 把活动窗口的高度设为 n 行 |
normal | [n]<C-w> | | 把活动窗口的宽度设为 n 行 |
"{register}
前缀可以指定寄存器,不指定默认用无名寄存器。如: "ayiw
复制一个单词到寄存器 a
中,"bdd
删除当前行到寄存器 b
中。"0
使用 y
复制文本同时会被 拷到复制寄存器 0
。"+
可以在复制前加上 "+
复制到系统剪贴板。注:需要支持 :echo has('clipboard')
返回结果为:1。".
上次插入的文本; "%
当前文件名。Tips:
:set clipboard=unnamed
可以直接复制粘贴系统剪贴板的内容。q
来进行录制,同时使用 q
来结束录制。q{register}
选择要保存的寄存器,把录制的命令保存其中。@{register}
回放寄存器中保存的一系列命令,达到批量操作。模式 | 命令 | 描述 |
---|---|---|
insert | <C-n> | 普通关键字(*) |
insert | <C-x><C-n> | 当前缓冲区关键字 |
insert | <C-x><C-i> | 包含文件关键字 |
insert | <C-x><C-]> | 标签文件关键字 |
insert | <C-x><C-k> | 字典查找 |
insert | <C-x><C-l> | 整行补全 |
insert | <C-x><C-f> | 文件名补全(*) |
insert | <C-x><C-o> | 全能(Omni)补全(*) |
Tips:
*noremap
非递归映射,而不要使用 *map
的递归映射。vim-plug
插件管理。
gruvbox
。vim-colors-solarized
。vim-hybird
。vim-startify
: 打开 Vim 时显示最近编辑的文件列表(Vim 启动界面)。vim-airline
: 状态栏美化。indentLine
: 增加代码缩进线。NERDTree
: 显示文件目录树LeaderF
: 文件搜索。vim-easymotion
: 光标快速跳转(墙裂推荐)。vim-surround
: 成对内容操作(主要是符号)。fzf.vim
: 模糊搜索。far.vim
: 搜索替换。vim-interestingwords
: 单词高亮。coc.vim
: 代码补全。vim-go
: 编写 Go 代码。python-mode
: 编写 Python 代码。tagbar
: 代码大纲。neoformat
。vim-autoformat
。ale
。neomake
。vim-commentary
: 代码注释。vim-fugitive
: 在 vim 中使用 git 命令。vim- gitgutter
: 在 vim 中显示 git 文件变动。图片来自: https://unsplash.com/photos/PkbZahEG2Ng
这篇文章主要介绍通过PowerDesigner
、Flyway
这两个工具来制作和执行数据库升级脚本。
假设这样一个场景:我们最新数据库模型版本为V1
,现在我们要为两个客户部署我们的系统(数据库使用V1
版本)。两天后开发人员A修改了数据库模型版本为V1.1
,这时又有另外一个客户想部署我们的系统(数据库使用V1.1
版本)。又过了几天后开发人员B修改了数据库模型版本为V1.2
,这时要求为前面几个已经部署了我们系统的客户升级系统,如果没有一个好的方式来对数据库脚本进行版本管理的话这种升级就会是一个比较「头大」的问题。这里将介绍一种流程和方式来对描述的问题进行解决。
要进行数据库脚本版本管理就要对数据库脚本的版本进行明确的定义和约束。
版本定义
完整示例:V3.0.0_1__create_user_table.sql
。说明:
V3.0.0
表示项目的开发版本号(必须);_1
表示升级脚本次数,每一次生成新的升级脚本次数+1
(必须),注:_
必须要有;__create_user_table
表示升级脚本描述信息(必选),注:__
为分隔符必须要有;PowerDesigner
生成的模型归档
文件名规则也遵照此方式命名,其中__create_user_table
这部分可以不要。
重要属性说明
File name
:升级脚本名称按 数据库脚本版本定义 规范取名;Using an archive model
:已归档模型文件,主要作用是于现在的数据模型进行对比最终生成增量的数据库升级脚本;Automatic archive
:自动归档当前的数据模型;确认没有问题后点击OK
生成最终的升级脚本。
归档新的数据模型用于下一次数据模型再变更时对比生成新的升级脚本。
生成完升级脚本后也应该生成一份最新的刷库脚本,用PowerDesigner
生成刷库的脚本比较简单选择菜单Databse->Generate Databse
按操作执行即可。
现在我们已经有了一个或多个升级脚本,要如何升级我们已经部署的多个不同版本系统数据库呢?举个简单的例子:
现在我们部署了三个系统(A1、A2、A3)分别使用的数据库刷库脚本
版本为V1.0
、V1.1
、V1.2
。最新的升级脚本已经为V1.6
,那么当升级时我们希望:
A1:V1.1->V1.2->V1.3->V1.4->V1.5->V1.6
A2:V1.2->V1.3->V1.4->V1.5->V1.6
A3:V1.3->V1.4->V1.5->V1.6
如何让这个过程更自动化更方便就是 Flyway 这个数据库版本控制工具要做的事情,Flyway 官网。
Flyway 集成的可选方式较多,官网也有详细的介绍,现在项目中集成的是 Flyway Maven 插件的方式。
当系统部署第一次执行刷库脚本后,就应该先创建数据库版本基线,执行mvn flyway:baseline
,这是以后数据库升级的基础。注:基线的设置只需要第一次初始化数据库时执行一次就好了,以后都不需要再执行。
当需要升级数据库时只需要执行mvn flyway:migrate
Flyway 将自动扫描指定目录下的升级脚本(.sql
文件),根据文件名的命名规则依次执行相关sql
文件。
schema_version
)当某个升级脚本执行失败时在schema_version
表中会产生一条失败数据,如果想修改升级脚本后重新执行mvn flyway:migrate
迁移命令。需要先将失败的元数据修复(其实就是删除掉),可以先执行mvn flyway:repair
然后再执行mvn flyway:migrate
。注:升级脚本已经执行的 sql 语句(如:创建表、修改表等)不能回滚需要手动清理。
更多的一些用法可参考 Flyway 官网。
通过PowerDesigner
生成的升级脚本
和刷库脚本
都会统一放到我们项目的db-migrate
模块,其中:create
目录存放刷库脚本,migration
目录存放升级脚本。
pom 配置:
1 |
|
操作步骤:
create
目录下的相关 sql 脚本完成后,执行mvn flyway:baseline
命令建立数据库版本基线(第一次刷库不需要执行mvn flyway:migrate
命令)。migration
目录下的升级脚本有增加,如:V3.0.0_8__xxxxx.sql
、V3.0.0_9__xxxxx.sql
,则只需要执行mvn flyway:migrate
命令即可。图片来自: https://unsplash.com/photos/en7G3hTSjBQ
当我们使用 Postman 发送一个请求时,可能会要求发送这个请求前先做用户认证(登录)。并且在具体请求某个 URL 时还会验证当前用户是否有权限请求这个 URL。在 Postman 中如何达到这一要求呢?
Interceptor 主要就是用来做请求的拦截。
访问 chrome webstore: 搜索 Postman Interceptor
然后进行安装。
配置 Interceptor
注:其中的Filter requests
参数可以自己配置,如:localhost:8081
表示只拦截本地的 8081 端口的请求。默认的配置.*
配置拦截所有请求,可以使用默认配置不用修改。
Interceptor配置完后,在浏览器中正常登录被测试的系统(这很重要)。只需要按正常的流程登录即可。
在 Postman 中启用 Interceptor,如下图:
至此通过 Postman 发送需要登录或授权的 URL 请求时已配置完成。
]]>