ETL脚本的版本管理方法和 SourceTree 使用
=============================
使用git管理Kettle 作业的一个注意
=============================
之前 ETL 作业是用 svn 管理的, 迁移到 git 管理也算是大势所趋吧. 这里重点讲一个git管理kettle作业的注意事项:
kettle 既支持基于数据库的repository也支持基于文件repository, 但我更推荐基于文件的repository, 一来脚本可以做版本管理, 二来可以控制上线流程. 如果使用git来管理kettle的作业文件库, 需要注意的是不要将git repository和kettle repository目录设定到同一层, kettle repository 最好是放在git repository的一个子目录下.
如果放到了同一层, 会有一个很严重的后果, 那就是在kettle设计器的open dialog对话框需要很长时间才能打开. 原因也简单, kettle在展现open dialog前, 先要遍历kettle repository下所有的文件, 如果git repository在同一层, kettle将遍历.git这个隐藏目录, 而这个目录的文件数量非常之多, 遍历自然会非常之慢的.
=============================
生产/开发环境的ETL脚本的版本管理方法
=============================
之前 ETL 作业是用 svn 管理的, 在一个专用的 svn repository 下, 创建了 prod 和 testing 目录, 分别对应的 prod 和 testing 环境下的 ETL 脚本. 客户端使用 tortoisesvn 管理, 本地也有两个目录对应 remote 端的两个目录.
svn 管理下的开发流程为: 先在 testing 目录开发, 然后将代码提交到 svn 远程库的 testing 目录下, 然后将远程 testing 目录发布到测试服务器上进行测试. 测试通过后, 将文件复制到本地的 prod 目录, 在提交到 svn 远程库的 prod 目录, 最后部署到 prod 服务器上. 整个过程简单而且不容易出错.
现在ETL 作业要迁移到 git 下管理, 至少有下面两个方案, 即:
方案 1: 采用 git 的 branch 来管理不同环境的 ETL 脚本. 这个做法和一般的业务系统开发一致.
方案 2: 同一个 git branch 使用不同的目录来管理不同的分支, 优点是:平时操作只要留意所在的目录, 而无需在意git的分支, 毕竟多数ETL开发人员对于git分支管理不太懂, 容易弄错.
我不推荐第 2 个方案, 原因有: ETL 作业其实不像业务系统开发一样, 业务系统中各个文件相互调用情况很多,多人协作是很平常的事情, 另外, 因为业务需要经常出很多feature/bugfix key版本, git 分支能有效解决这两个痛点. 对于ETL版本管理, 没有必要采用稍显复杂的分支方法. 注意这里所讲的复杂, 并不是指git和 branch相关命令有多复杂, 而是引入这个方案给将来持续开发和上线.
如果你的项目管理是按照方案 2 进行的, 随便什么 git 客户端都很好用, 都不会弄错. 如果是采用方案 1, 我特别推荐使用 sourcetree 这个软件, 原因有:
1. 可以使用非常醒目的 Tab 页的方式来管理不同的 git 库或分支.
2. 在每个 tab 页下左边的树形结构中, 当前的分支名称被粗体字显示.
下面是一些 sourcetree 使用技巧:
=============================
sourcetree 免注册使用
=============================
参考: http://blog.csdn.net/qq_25867649/article/details/73163510
sourcetree 2.4.8版本安装后需要注册, 下面是跳过注册的方法,
1. 找到目录:C:\Users\用户\AppData\Local\Atlassian\SourceTree
2. 新建 accounts.json 文件里面输入
[
{
"$id": "",
"$type": "SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity",
"Authenticate": true,
"HostInstance": {
"$id": "",
"$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount",
"Host": {
"$id": "",
"$type": "SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount",
"Id": "atlassian account"
},
"BaseUrl": "https://id.atlassian.com/"
},
"Credentials": {
"$id": "",
"$type": "SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account",
"Username": "",
"Email": null
},
"IsDefault": false
}
]
=============================
使用本机多个目录来对应远程 git 的多个分支
=============================
假设项目 A 有 master/prod/testing 三个分支, 我们在本机先建立三个对应的目录.
1. 在界面上新建 tab 页, 然后点击 clone, 输入远程的 git 地址, 输入本机 prod 的目录, 点击"高级选项", 选择远程的 prod 分支 (缺省是 master 分支), 点击确定, git 的 prod 版本就会下载到本机. 同时 sourcetree 主界面上也有一个 prod 的 tab 页.
2. 同样的步骤, 将 testing 分支签出到 master 和 testing 目录
3. 经过上述步骤, sourcetree 就有三个 tab 页, 每个页对应不同的分支, 每个分支对应不同的本地目录.
效果如下:

=============================
SourceTree&Git 部分名词解释
=============================
参考: https://www.jianshu.com/p/be9f0484af9d
克隆 (clone):从远程仓库 URL 加载创建一个与远程仓库一样的本地仓库
检出 (checkout):切换不同分支
添加(add):添加文件到缓存区(stage), 为commit操作做准备.
提交 (commit):将暂存文件(staged file)上传到本地仓库
推送 (push):将本地仓库同步至远程仓库,一般推送(push)前先拉取(pull)一次,确保一致
移除(remove):移除文件至缓存区
贮藏 (stash):保存工作现场,
重置 (reset):回到最近添加 (add)/提交 (commit) 状态
抓取 (fetch):从远程仓库获取信息并同步至本地仓库
拉取 (pull):从远程仓库获取信息并同步至本地仓库,并且自动执行合并(merge)操作,即 ** pull=fetch+merge **
分支 (branch):创建/修改/删除分枝
标签 (tag):给项目增添标签
工作流 (Git Flow):团队工作时,每个人创建属于自己的分枝(branch),确定无误后提交到 master 分枝
终端 (terminal):可以输入 git 命令行
=============================
sourcetree软件的pull按钮和merge按钮
=============================
sourcetree 的pull按钮其实相当于 fetch+merge 或fetch+rebase. 这里的merge 和 merge 按钮有一些小的区别. pull中的merge是将远程仓库最新版本merge到本地work copy. 而 merge 按钮功能更加通用, 可以将不同的分支的任意提交合并到本地work copy.
另外, 一般情况下项目成员各自负责自己的模块或文件, 所以文件版本冲突的可能性很小, 基于这个前提, 在使用sourcetree的pull操作时候, 推荐使用rebase模式, 而不是merge模式. 这样的好处是, 提交历史的graph是一个直线, 而不会有很多分叉.

========================
merge和rebase的区别
========================
合并 (merge):将多个同名文件合并为一个文件,该文件包含多个同名文件的所有内容,相同内容抵消
变基 (rebase):和merge命令的目的相同,都是用来合并两个commit. merge合并的思路很简单, 而rebase的合并比较复杂, 假设现在有两个分支, 它们是从很久的一个公共commit后就开始分叉, rebase大致的操作过程是, (1)git先会把本地分支所有的commit都回滚到公共点上,并且把它们临时 保存为补丁(patch), 这些补丁放到".git/rebase"目录中. (2)然后拉取另一个分支,(3)然后再把这些patch逐一提交.
变基的更多说明:
https://blog.csdn.net/hudashi/article/details/7664631



====================================
stage(暂存)和stash(贮藏)的区别
====================================
stage 等同于 Index 区.
stage(暂存)和stash(贮藏)的区别: stage暂存其实就是git add, 现将改动加到暂存区, 然后才能commit. stash贮藏区是另一个概念, 用作工作现场的交换区, 我们可以将手头上未提交的改动, 通过 git stash save命令放到贮藏区中, 然后从远程库pull一个分支完成一些工作, 然后我们可以使用 git stash pop 将贮藏区的工作空间完整恢复回来, 然后继续之前的工作.
========================
如何理解 origin 和 master?
========================
摘自: https://blog.csdn.net/abo8888882006/article/details/12375091
在clone完成之后, git客户端将在本地创建一个.git 隐藏目录,并会自动为你将此远程仓库命名为origin(origin只本地仓库给远程仓库起的一个别名, 该别名保存在.git/config文件中, 而本地仅仅是一个克隆), 并下载其中所有的数据,建立一个指向它的master 分支的指针,我们用(远程仓库名)/(分支名) 这样的形式表示远程分支,所以origin/master指向的是一个remote branch(从那个branch我们clone数据到本地),但你无法在本地更改其数据.
同时,Git 会建立一个属于你自己的本地master 分支,它指向的是你刚刚从remote server传到你本地的副本.随着你不断的改动文件,git add, git commit,master的指向会自动移动,你也可以通过merge(fast forward)来移动master的指向.
========================
如何理解 Fast-forward?
========================
git merge 有个Fast-forward模式,即快进模式. 举例讲解一下它的含义, 假设本地有一个master 分支, 紧接着创建了一个dev 分支, 并在dev 分支上对文件做了修改, 然后我们想把这些修改合并到本地的master分支上. 这期间master分支没有做任何修改, 所以合并其实很简单, 只需要移动master指向到dev, 没有任何文件上的合并操作, 对于这样的合并, 叫做Fast-forward合并.
显然并不是所有的合并都可以使用快进模式, 它不适合两个分支都各自长出叶子的情形. 另外, 快进合并后, 分支血缘上没有dev的痕迹. 如果比较注重分支过程管理, 就不推荐使用快进模式, 参数为 no-ff
参考:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013760174128707b935b0be6fc4fc6ace66c4f15618f8d000
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000
=============================
git cheatsheet
=============================
下面网站是git的cheatsheet, 直观地展现了git 各个Area和相应的命令.
http://ndpsoftware.com/git-cheatsheet.html

ETL脚本的版本管理方法和 SourceTree 使用的更多相关文章
- ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方法
原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打 ...
- Spark Rdd coalesce()方法和repartition()方法
在Spark的Rdd中,Rdd是分区的. 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多,但是每个Rdd的数据量比较小,需要设置一个比较合理的分区.或者需要把Rdd的分区数量 ...
- ThinkPHP的D方法和M方法的区别
M方法和D方法的区别 ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类. 使用M方法 如果是如下情况,请考虑使用 ...
- 精益化设计:把敏捷方法和Lean UX相结合
敏捷方法已经成为了主流.同时,Kindle和iPhone等设备取得的巨大成功也推动了体验设计的飞速发展.不过,如何把敏捷方法和UX设计结合起来,一直以来都是一个难题.文章将探讨如何把UX融入到最流行的 ...
- Hibernate中evict方法和clear方法说明
Hibernate中evict方法和clear方法说明 先创建一个对象,然后调用session.save方法,然后调用evict方法把该对象清除出缓存,最后提交事务.结果报错: Exception i ...
- Android HTTP实例 使用GET方法和POST方法发送请求
Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...
- virtual方法和abstract方法
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
- Java提高篇——equals()方法和“==”运算符
equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...
- OC语言description方法和sel
OC语言description方法和sel 一.description方法 Description方法包括类方法和对象方法.(NSObject类所包含) (一)基本知识 -description(对象 ...
随机推荐
- Dynamic CRM 2015学习笔记(2)更改系统显示语言
默认装的是英文的系统,想换成中文的.下面列出操作步骤: 1. 下载并安装语言包 http://www.microsoft.com/en-US/download/details.aspx?id=4501 ...
- 654. Maximum Binary Tree
654. Maximum Binary Tree 题目大意: 意思就是给你一组数,先选一个最大的作为根,这个数左边的数组作为左子树,右边的数组作为右子树,重复上一步. 读完就知道是递归了. 这个题真尼 ...
- XML学习入门
很久没更新博客了.来一发! 关于XML,当时没学过感觉难吧?其实XML还是蛮好学的,这里留下一些入门级别的内容. XML中dtd(文档类型定义)的主要用处是约束xml,也可以去约束html,xhtml ...
- 搭建高可用的Redis服务,需要注意这些方面!
搭建高可用的Redis服务,需要注意这些方面! HorstXu 占小狼的博客 今天 ◎作者 | HorstXu www.cnblogs.com/xuning/p/8464625.html 基于内存的R ...
- jQuery preventDefault() ,stopPropagation(),stopImmediatePropagation()
preventDefault()函数用于阻止当前触发事件的默认行为. 在HTML文档中,当我们触发某些DOM元素的特定事件时,可以执行该元素的默认行为.比如链接的click事件:当我们点击一个链接时, ...
- macOS在virtualenv中使用wxPython报错
在虚拟的Python环境中运行GUI的软件报错 This program needs access to the screen. Please run with a Framework build o ...
- 【洛谷P1082】同余方程
题目大意:求关于 \(x\) 的同余方程 \[ax \equiv 1 \pmod {b}\] 的最小正整数解. 题解:exgcd 板子题. 代码如下 #include <bits/stdc++. ...
- c# WebApi之解决跨域问题:Cors
什么是跨域问题 出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容.由于这个原因,我们不同站点之间的数据访问会被拒绝. Cors解决跨域问 ...
- Java实现二叉树的前序、中序、后序、层序遍历(非递归方法)
在上一篇博客中,实现了Java中二叉树的四种遍历方式的递归实现,接下来,在此实现Java中非递归实现二叉树的前序.中序.后序.层序遍历,在非递归实现中,借助了栈来帮助实现遍历.前序和中序比较类似, ...
- Spring 学习笔记一
1.IOC,DI. 2.装配bean基于xml(实例化,声明周期,后处理bean,属性注入).3.装配bean基于注解 1 spring框架概述 1.1 什么是spring l Sp ...