介绍

随着DevOps兴起,在做CD代码上线交付时候,代码全量更新是很费时间的。下面代码就可以帮助我们从指定分支两个Tag中获取差异文件,进行代码的增量更新。

环境

Jenkins

Git代码管理

获取指定分支最新得两个tag

使用到了 git tag -l 命令,git tag -l 名称* 模糊查询标签列表。利用 名称* 方式我们可以区分不同分支的tag。

生成远程执行更新脚本

主要做文件删除。

--diff-filter说明

--diff-filter=[(A|C|D|M|R|T|U|X|B)…[*]]

只选择那些添加 (A), 赋值 (C), 删除 (D), 修改 (M), 重命名 (R)的文件, 它们的类型(如 普通文件, 符号链接, 子模块, …) 是否改变 (T), 是否未合并 (U), 是未知 (X), 或它们的对崩溃(B). 任何过滤字符的组合(包括none)均可使用。当组合中包括All或none,如果任一文件匹配了其他选项,就选择了所有路径。如果没有文件匹配其他选项,什么都不做。

Diff现在支持接受小写字母参数,含义为展示所有非指定类型的变化。

被删除的文件

由最新的 Tag 和上一个 Tag 做对比,用 --diff-filter=D。

delete_file_list=($(git diff $second_real_tag $first_real_tag --name-only --diff-filter=D))

echo "----------------把要删除得文件写入shell脚本-----------------"

for item in ${delete_file_list[@]};

do

echo $item

echo "rm -rf ${item}" >> update_dir/jenkins_update.sh

done

被重命名的文件

这里有个小技巧,由上一个的 Tag 和最新 Tag 做反向对比,用 --diff-filter=R。

rename_file_list=($(git diff $first_real_tag $second_real_tag --name-only --diff-filter=R))

echo "----------------把重命名的文件也加入删除shell脚本-----------------"

for item in ${rename_file_list[@]};

do

echo $item

echo "rm -rf ${item}" >> update_dir/jenkins_update.sh

done

完整shell脚本

#!/bin/bash

# 创建更新目录

rm -rf update_dir

mkdir update_dir

# 获取最新得两个tag

last_two_tags=($(git tag -l release_*))

last_two_tags_len=${#last_two_tags[*]}

# 获取去除tag其他标识

first_real_tag=${last_two_tags[$last_two_tags_len-1]}

second_real_tag=${last_two_tags[$last_two_tags_len-2]}

echo "----------------当前对比两个版本-----------------"

echo $first_real_tag

echo $second_real_tag

# 创建删除文件列表shell

touch ./update_dir/jenkins_update.sh

echo "#!/bin/bash" >> update_dir/jenkins_update.sh

# 把要删除得文件写入shell脚本

delete_file_list=($(git diff $second_real_tag $first_real_tag --name-only --diff-filter=D))

echo "----------------把要删除得文件写入shell脚本-----------------"

for item in ${delete_file_list[@]};

do

echo $item

echo "rm -rf ${item}" >> update_dir/jenkins_update.sh

done

# 把重命名的文件也加入删除shell脚本

rename_file_list=($(git diff $first_real_tag $second_real_tag --name-only --diff-filter=R))

echo "----------------把重命名的文件也加入删除shell脚本-----------------"

for item in ${rename_file_list[@]};

do

echo $item

echo "rm -rf ${item}" >> update_dir/jenkins_update.sh

done

echo "----------------拷贝要更新的文件到update_dir文件夹-----------------"

# 复制当前版本差异到 update_dir 限制 Add Create Modify Rename 操作

new_file=($(git diff $second_real_tag $first_real_tag --name-only --diff-filter=ACMR))

new_file_len=${#new_file[*]}

if (($new_file_len>0)); then

cp -pv --parents $(git diff $second_real_tag $first_real_tag --name-only --diff-filter=ACMR) ./update_dir/

fi

diff git 指定时间_【GIT】从指定分支两个Tag中获取差异文件,进行代码的增量更新...相关推荐

  1. html中wmv播放不要自动播放,网页播放器 windowsmediaplay中控制从wmv的指定时间开始播放,指定时间停止播放...

    首页 > 网络编程 > 网页播放器 > 网页播放器 windowsmediaplay 网页播放器 windowsmediaplay中控制从wmv的指定时间开始播放,指定时间停止播放 ...

  2. PHP获取时间戳、获取天周月的起始时间、指定时间所在周、指定时间的各个周等相关函数

    目录 一.时间戳和日期互相转换 二.PHP获取今日.昨日.上周.本周.上月.本月的起始时间戳 三.获取当前周的每天的起始时间 四.获取周的起始时间 1.根据指定时间获取所在周的起始时间和结束时间 2. ...

  3. mysql时间相减得到天数保留两位_mysql 中两个日期相减获得 天 小时 分钟 或者 小时:分钟的格式...

    /**有一个需求,要求获得两个日期想减的天数,小时数,分钟数.通过查找资料,于是乎我写出了如下代码,来获得两个字段.*/ IFNULL(CONCAT( IF(aib.`forecast_reply_t ...

  4. java jar包资源文件_深入jar包:从jar包中读取资源文件

    我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...

  5. java创建指定日期_如何创建指定的日期和时间

    import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...

  6. mysql 分区指定路径_[数据库]MySQL 指定各分区路径

    [数据库]MySQL 指定各分区路径 0 2016-11-08 18:00:44 介绍 可以针对分区表的每个分区指定各自的存储路径,对于innodb存储引擎的表只能指定数据路径,因为数据和索引是存储在 ...

  7. MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

    <span style="font-family: 'Microsoft YaHei'; font-size: 14px;">MySQL定时任务event</sp ...

  8. 查找树的指定层级_非递归层次遍历方法实现二叉树中指定节点的层次数查找

    数据结构教材中,提供了基于队列实现一个二叉树的非递归层次遍历算法.但对于一个任意二叉树,如果要查找其中任何一个节点所在的层次数,教科书中并没有给出基于层次遍历的非递归算法.鉴于层次遍历算法比较容易理解 ...

  9. java 删除指定字符_字符串删除指定位置字符 JAVA 删除字符串中指定的字符

    <死侍2>有多不按套路出牌? 要CSS布局HTML小编今天和大家分享用到函数的调用. 编制函数fun,其功能是:删除一个字符串中指定的一.问题描述:从键盘输入一个字符串给str和一个字符给 ...

最新文章

  1. NET::ERR_CACHE_MISS
  2. KVM中virtio、vhost 和vhost-user比较(十一)
  3. push to origin/master was rejected错误解决方案
  4. 如何跟随有三从零进阶中级CV算法工程师
  5. java http post 传参数_HttpClient之带参数的post请求
  6. 复变函数画图cosz图像_用matlab绘制x=(1+cosu)cosv,y=(1+cosu)sinv,z=sinu图像?
  7. linux 下安装部署mq,RocketMQ在linux下安装部署
  8. NTP (Network Time Protocol)
  9. shell脚本监控cpu/内存使用率 转
  10. 一个简单的samba案例(测试与思考)
  11. c语言中L''作用,L/C问题: 请问L/C上的49:Confirmation Instruction 有什么作用啊[1]
  12. [转载] arrayproxy转numpy_Python numpy.ptp() 使用实例
  13. 【转】如何防止softmax函数上溢出(overflow)和下溢出(underflow)
  14. 72张三国历史演变地图
  15. word复制某些公式无响应处理方法
  16. postgresql.conf bgwriter_lru_multiplier
  17. 本周大新闻|苹果首款MR没有主打卖点;Meta认为AI是AR OS的基础
  18. 前辈做的电子地图API调研,转过来…
  19. CSS hack常用方案(摘选)
  20. 【云原生】k8s(Kubernetes)中yaml文件快速阅读理解

热门文章

  1. date-打印或者设置系统日期和时间
  2. 20155324 《信息安全系统设计基础》课程总结
  3. Codeforces Round #415 (Div. 2) C. Do you want a date?
  4. [转载]百分之百自动登录2345王牌技术员联盟源代码(delphi)
  5. spring:利用Spring AOP 使日志输入与方法分离
  6. sqlserver日期函数 dateadd,datediff ,datepart ,datename,convert
  7. Takeown 实现解析
  8. 法拉利杀手Koenigsegg CCX
  9. Javascript访问Cookie的四个常用方法
  10. [转载] Python max() 方法