相关文章推荐
失落的皮蛋  ·  git ...·  2 周前    · 
刀枪不入的手套  ·  Why is my DLL using ...·  5 月前    · 
逼格高的沙发  ·  logback 里面设置 ...·  7 月前    · 
果断的青椒  ·  Devexpress ...·  1 年前    · 
版权声明:本文为【字节卷动】原创,依据 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) 许可证进行授权,欢迎转载,转载请附上出处链接及本声明。【博客地址 http://blog.csdn.net/ouyang_peng】 本文链接: https://blog.csdn.net/ouyang_peng/article/details/88685202

一、需求描述

每次集成提测,都会有一大批的人员合并代码到develop分支,然后jenkins编译完成之后,得写提测记录。之前负责提测的人员都是直接复制jenkins的修改记录页面的文字。如下所示:

但是这个复制出来的文字会有个问题,就是显示出来的文字可能都不是全部的提交记录,比如下面这个第12条就没有显示完整。
在这里插入图片描述
必须点击details按钮,才能找到全部的提交信息。

因此,这个负责提测的人员可能每次写的提测记录都是词不达意,不知道写的什么玩意。导致测试人员可能每次也不知道到底测试什么。

因此我们的需求是:将上一次成功编译之后的jenkins任务和这一次成功编译的jenkins任务直接的变更记录都能够完完整整的显示出来,因此我决定写一个shell脚本来帮助这位同事。

二、熟悉 git log 命令

主要是参考了上面的两篇文章,重新梳理了一下git log 命令的用法。

下面直接转载 博客园-阁刚广志,地址: http://www.cnblogs.com/bellkosmos/p/5923439.html 来复习下git log命令

git log用于查询版本的历史,命令形式如下:

git log [<options>] [<since>..<until>] [[--] <path>...]

这条命令有很多参数选项

2.1 一、不带参数

  • 如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明
  • 如果记录过多,则按Page Up、Page Down、↓、↑来控制显示
  • 按q退出历史记录列表

2.2 二、显示参数

2.2.1 -p

-p:按补丁显示每个更新间的差异,比下一条- -stat命令信息更全

2.2.2 --stat

--stat:显示每次更新的修改文件的统计信息,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计

2.2.3 --shortstat

--shortstat:只显示–stat中最后的行数添加修改删除统计

2.2.4 --name-only

--name-only:尽在已修改的提交信息后显示文件清单

2.2.5 --name-status

--name-status:显示新增、修改和删除的文件清单

2.2.6 --abbrev-commit

--abbrev-commit:仅显示SHA-1的前几个字符,而非所有的40个字符

2.2.7 --relative-date

--relative-date:使用较短的相对时间显示(例如:“two weeks ago”)

2.2.8 --graph

--graph:显示ASCII图形表示的分支合并历史

2.2.9 --pretty

--pretty=:使用其他格式显示历史提交信息,可选项有:oneline,short,medium,full,fuller,email,raw以及format:,默认为medium,如:

  • –pretty=oneline:一行显示,只显示哈希值和提交说明(–online本身也可以作为单独的属性)

  • –pretty=format:” ":控制显示的记录格式,如:

    1. %H 提交对象(commit)的完整哈希字串
    2. %h 提交对象的简短哈希字串
    3. %T 树对象(tree)的完整哈希字串
    4. %t 树对象的简短哈希字串
    5. %P 父对象(parent)的完整哈希字串
    6. %p 父对象的简短哈希字串
    7. %an 作者(author)的名字
    8. %ae 作者的电子邮件地址
    9. %ad 作者修订日期(可以用 -date= 选项定制格式)
    10. %ar 作者修订日期,按多久以前的方式显示
    11. %cn 提交者(committer)的名字
    12. 作者和提交者的区别不知道是啥?
    13. 作者与提交者的关系:作者是程序的修改者,提交者是代码提交人(自己的修改不提交是怎么能让别人拉下来再提交的?)
    14. 其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者(soga)
    15. %ce 提交者的电子邮件地址
    16. %cd 提交日期(可以用 -date= 选项定制格式)
    17. %cr 提交日期,按多久以前的方式显示
    18. %s 提交说明
  • 带颜色的–pretty=format:” ",这个另外写出来分析

    1. 以这句为例:%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>

    2. 它的效果是:
      在这里插入图片描述

    3. 先断句:[%Cred%h][%Creset -][%C(yellow)%d ][%Cblue%s][%Cgreen(%cd)][%C(bold blue)<%an>]

    4. 然后就是很明显能得到的规律了

      1. 一个颜色+一个内容
      2. 颜色以%C开头,后边接几种颜色,还可以设置字体,如果要设置字体的话,要一块加个括号
        1. 能设置的颜色值包括:reset(默认的灰色),normal, black, red, green, yellow, blue, magenta, cyan, white.
        2. 字体属性则有bold, dim, ul, blink, reverse.
      3. 内容可以是占位元字符,也可以是直接显示的普通字符

2.2.10 --date

--date= (relative|local|default|iso|rfc|short|raw):定制后边如果出现%ad或%cd时的日期格式

  1. 有几个默认选项
    1. --date=relative:shows dates relative to the current time, e.g. “2 hours ago”.
    2. --date=local:shows timestamps in user’s local timezone.
    3. --date=iso (or --date=iso8601):shows timestamps in ISO 8601 format.
    4. --date=rfc (or --date=rfc2822):shows timestamps in RFC 2822 format,often found in E-mail messages.
    5. --date=short:shows only date but not time, in YYYY-MM-DD format.这个挺好用
    6. --date=raw:shows the date in the internal raw git format %s %z format.
    7. --date=default:shows timestamps in the original timezone (either committer’s or author’s).

  2. 也可以自定义格式(需要git版本2.6.0以上),比如–date=format:‘%Y-%m-%d %H:%M:%S’ 会格式化成:2016-01-13 11:32:13,其他的格式化占位符如下:
    1. %a:Abbreviated weekday name
    2. %A:Full weekday name
    3. %b:Abbreviated month name
    4. %B:Full month name
    5. %c:Date and time representation appropriate for locale
    6. %d:Day of month as decimal number (01 – 31)
    7. %H: Hour in 24-hour format (00 – 23)
    8. %I:Hour in 12-hour format (01 – 12)
    9. %j:Day of year as decimal number (001 – 366)
    10. %m:Month as decimal number (01 – 12)
    11. %M:Minute as decimal number (00 – 59)
    12. %p:Current locale’s A.M./P.M. indicator for 12-hour clock
    13. %S:Second as decimal number (00 – 59)
    14. %U:Week of year as decimal number, with Sunday as first day of week (00 – 53)
    15. %w:Weekday as decimal number (0 – 6; Sunday is 0)
    16. %W:Week of year as decimal number, with Monday as first day of week (00 – 53)
    17. %x:Date representation for current locale
    18. %X:Time representation for current locale
    19. %y:Year without century, as decimal number (00 – 99)
    20. %Y:Year with century, as decimal number
    21. %z, %Z:Either the time-zone name or time zone abbreviation, depending on registry settings; no characters if time zone is unknown
    22. %%:Percent sign

2.3 三、筛选参数:

  1. -n:显示前n条log
  • 按日期
    1. –after=
      1. 比如git log --after="2014-7-1”,显示2014年7月1号之后的commit(包含7月1号)
      2. 后边的日期还可以用相对时间表示,比如"1 week ago"和”yesterday",比如git log --after=“yesterday”
      3. 这里的格式可以是什么?
    2. –before=
      1. 同上
      2. 另外这两条命令可以同时使用表示时间段,比如git log --after=“2014-7-1” --before=“2014-7-4”
      3. 另外–since --until和 --after --before是一个意思,都可以用
  • 按作者
    1. –author=
      1. 比如git log --author=“John",显示John贡献的commit
      2. 注意:作者名不需要精确匹配,只需要包含就行了
      3. 而且:可以使用正则表达式,比如git log --author="John|Mary”,搜索Marry和John贡献的commit
      4. 而且:这个–author不仅包含名还包含email, 所以你可以用这个搜索email
  • 按commit描述
    1. –grep=
      1. 比如:git log --grep=“JRA-224”
      2. 而且:可以传入-i用来忽略大小写
      3. 注意:如果想同时使用–grep和–author,必须在附加一个–all-match参数
  • 按文件
    • -(空格)或[没有]
    1. 有时你可能只对某个文件的修改感兴趣, 你只想查看跟某个文件相关的历史信息, 你只需要插入你感兴趣文件的路径[对,是路径,所以经常是不太好用]就可以了
    2. 比如:git log – foo.py bar.py ,只返回和foo.py或bar.py相关的commit
    3. 这里的–是告诉Git后面的参数是文件路径而不是branch的名字. 如果后面的文件路径不会和某个branch产生混淆, 你可以省略- -,比如git log foo.py
    4. 另外,后边的路径还支持正则,比如:git log *install.md 是,指定项目路径下的所有以install.md结尾的文件的提交历史
    5. 另外,文件名应该放到参数的最后位置,通常在前面加上–并用空格隔开表示是文件
    6. 另外,git log file/ 查看file文件夹下所有文件的提交记录
  • 按分支
    1. –branchName branchName为任意一个分支名字,查看某个分支上的提交记录
    2. 需要放到参数中的最后位置处
    3. 如果分支名与文件名相同,系统会提示错 误,可通过–选项来指定给定的参数是分支名还是文件名
      1. 比如:在当前分支中有一个名为v1的文件,同时还存在一个名为v1的分支
      2. git log v1 – 此时的v1代表的是分支名字(--后边是空的)
      3. git log – v1 此时的v1代表的是名为v1的文件
      4. git log v1 -- v1 代表v1分支下的v1文件
  • 按内容
    1. -S"“、-G”"
      1. 有时你想搜索和新增或删除某行代码相关的commit. 可以使用这条命令
      2. 假设你想知道Hello, World!这句话是什么时候加入到项目里去的,可以用:git log -S"Hello,World!"
      3. 另外:如果你想使用正则表达式去匹配而不是字符串, 那么你可以使用-G代替-S.
      4. 这是一个非常有用的debug工具, 使用他你可以定位所有跟某行代码相关的commit. 甚至可以查看某行是什么时候被copy的, 什么时候移到另外一个文件中去的
      5. 注:-S后没有"=",与查询内容之间也没有空格符
  • 按范围
    1. git log …
      1. 这个命令可以查看某个范围的commit
      2. 这个命令非常有用当你使用branch做为range参数的时候. 能很方便的显示2个branch之间的不同
      3. 比如:git log master…feature,master…feature这个range包含了在feature有而在master没有的所有commit,同样,如果是feature…master包含所有master有但是feature没有的commit
      4. 另外,如果是三个点,表示或的意思:git log master…test 查询master或test分支中的提交记录
  • 过滤掉merge commit
    1. –no-merges
      1. 默认情况下git log会输出merge commit. 你可以通过–no-merges标记来过滤掉merge commit,git log --no-merges
      2. 另外,如果你只对merge commit感兴趣可以使用—merges,git log --merges
  • 按标签tag
    1. git log v1.0
      1. 直接这样是查询标签之前的commit
      2. 加两个点git log v1.0… 查询从v1.0以后的提交历史记录(不包含v1.0)
  • 按commit
    1. git log commit :查询commit之前的记录,包含commit
    2. git log commit1 commit2:查询commit1与commit2之间的记录,包括commit1和commit2
    3. git log commit1…commit2:同上,但是不包括commit1
      1. 其中,commit可以是提交哈希值的简写模式,也可以使用HEAD代替
        1. HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,等同于HEAD~1
        2. HEAD~2代表倒数第二次提交
  • 最后干货,你会喜欢的~
    下面第一条的效果是这样:

    git config --global alias.lm  "log --no-merges --color --date=format:'%Y-%m-%d %H:%M:%S' --author='你的名字!自己修改!' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
    git config --global alias.lms  "log --no-merges --color --stat --date=format:'%Y-%m-%d %H:%M:%S' --author='你的名字!自己修改!' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
    git config --global alias.ls "log --no-merges --color --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
    git config --global alias.lss "log --no-merges --color --stat --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
    

    三、编写shell脚本

    3.1 使用git log 命令 编写shell脚本

    编写一个 show_git_log.sh 脚本,并将该脚本放到项目中,上传到gitlab中。

    show_git_log.sh 脚本内容如下所示:

    #!/bin/bash
    # 用于打印 两次 commit sha1 直接的提交记录,按照作者名称依次过滤打印出来,方便提测
    # 命令执行的时候 如: ./show_git_log.sh a383d2477351fab794981b6e79400bd0d8e99ddb
    # 打印的结果为:     传递进来的参数为: ./show_git_log.sh  a383d2477351fab794981b6e79400bd0d8e99ddb  
    # $0 为  ./show_git_log.sh 
    # $1 为  上一次成功编译的commit号
    echo "传递进来的参数为: $0  $1"
    #commit 提交的作者数组,方便一次遍历
    arr=("ouyangpeng" "user1" "user2" "user3" "user4" "user5"  "user6" "user7" "user8" "user9" )
    #循环使用git log命令 通过 author来过滤
    for value in ${arr[@]}
      #git log --branches refs/remotes/origin/feature/DevelopGlobalXtc $1..HEAD --pretty=format:"%cn %s" --author=$value  --no-merges
      #git log --branches refs/remotes/origin/$2 $1..HEAD --pretty=format:"%cn %s" --author=$value  --no-merges
      git log $1..HEAD --pretty=format:"%cn %s" --author=$value  --no-merges
      echo "\n"
    

    如上所示,我们将成员小组的全部人员,放在了一个数组里面,然后循环执行git log命令并通过 author来过滤。我们使用了

    git log commit1 .. commit2:查询commit1与commit2之间的记录,包括commit1和commit2.
    

    其中 HEAD 是最新的commit信息。

    3.2 配置jenkins

    3.2.1 添加一个参数化构建过程

    1. 在jenkins的具体job中,在【参数化构建过程】中,添加一下参数,类型为【String Parameter】

    在这里插入图片描述
    2. 设置具体的参数内容

    • 名字:设置为 LAST_SUCCESS_BUILD_GIT_COMMIT
    • 默认值: 不设置
    • 描述: 上一次编译成功的git commi值
      在这里插入图片描述

    3.2.2 在构建中使用这个参数

    在jenkins的job配置中,【构建】中添加一个【添加构建步骤】,类型宣威【Execute shell】,如下所示:
    在这里插入图片描述

    由于我原本就有了,所以在原来的基础上添加上新的shell脚本即可,如下所示

    在这里插入图片描述
    新添加的shell脚本内容如下:其中${LAST_SUCCESS_BUILD_GIT_COMMIT}是刚刚定义的动态化参数。

    # 打印git log 记录
    chmod 777 ./show_git_log.sh
    ./show_git_log.sh ${LAST_SUCCESS_BUILD_GIT_COMMIT}
    

    3.3 执行jenkins任务

    如上图所示,点击【Build with Parameters】执行jenkins任务,在【LAST_SUCCESS_BUILD_GIT_COMMIT】这个参数中,填写好上一次成功编译的git commit sha1 值。

    如上所示,第18次成功编译的 git Revision为 : a383d2477351fab794981b6e79400bd0d8e99ddb
    将该版本号信息填入之后,点击【开始构建】

    jenkins job执行最后调用刚刚的shell脚本,如下所示,将两次git commit 之间的提交记录都打印出来了。

    查看下第19次的jenkins的change,如下所示
    在这里插入图片描述
    可以发现和上面执行shell脚本打印出来的一样。

    现在同步下主干代码,然后开启第20次编译。
    在这里插入图片描述
    编译完成之后,jenkins的打印结果如下

    对比下jenkins自己打印出来的 修改记录。
    在这里插入图片描述
    没问题,但是我们打印出来的 通过不同作者已经归纳到一个地方,方便提测。

    之前那位提测的同学,每次整理这些日志 至少十分钟,现在 直接复制粘贴即可,几秒钟搞定了。

    四、使用git shortlog命令

    git shortlog是一个特殊版本的git log, 他的目的是为了创建一个发布的通知. 将commit按照作者分组, 显示每个commit的第一行描述. 通过他你很容易看到谁做了些什么.

    因此我们使用git shortlog命令来重新实现刚才的代码,更加简洁明了,而且也不需要维护一份提交者的数组了,如下所示

    4.1 使用git shotlog命令重写show_git_log.sh脚本

    show_git_log.sh 的源代码如下所示:

    #!/bin/bash
    # 用于打印 两次 commit sha1 直接的提交记录,按照作者名称依次过滤打印出来,方便提测
    # 命令执行的时候 如: ./show_git_log.sh a383d2477351fab794981b6e79400bd0d8e99ddb
    # 打印的结果为:     传递进来的参数为: ./show_git_log.sh  a383d2477351fab794981b6e79400bd0d8e99ddb
    # $0 为  ./show_git_log.sh
    # $1 为  上一次成功编译的commit号
    echo "传递进来的参数为: $0  $1"
    git shortlog $1..HEAD --pretty=format:"%cn %s" --no-merges
    

    在git bash 界面 执行命令,如下所示,直接只能分好了组,比我自己实现的好多了。

    $ ./show_git_log.sh a383d2477351fab794981b6e79400bd0d8e99ddb
    

    4.2 jenkins执行看效果

    将第20次的版本号 6121536bb9883b9dc1eb877426e53c1d0f5adf3e 填入,开始构建
    在这里插入图片描述

    编译完成之后,打印出来的日志如下所示:

    第21次编译,jenkins显示的修改记录如下。
    在这里插入图片描述

    对比一下,明显我打印出来的更加美观,完美!分好了小组,每个不同的author分为一组,清晰明了。

    • https://git-scm.com/docs/git-log
    • https://git-scm.com/docs/git-shortlog
    • http://www.cnblogs.com/bellkosmos/p/5923439.html
    • http://www.cnblogs.com/irocker/p/advanced-git-log.html

    作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
    转载请保留原文地址:https://ouyangpeng.blog.csdn.net/article/details/88685202

    ☞ 本人QQ: 3024665621
    ☞ QQ交流群: 123133153
    ☞ github.com/ouyangpeng
    ☞ oypcz@foxmail.com

    一、需求描述每次集成提测,都会有一大批的人员合并代码到develop分支,然后jenkins编译完成之后,得写提测记录。之前负责提测的人员都是直接复制jenkins的修改记录页面的文字。如下所示:但是这个复制出来的文字会有个问题,就是显示出来的文字可能都不是全部的提交记录,比如下面这个第12条就没有显示完整。必须点击details按钮,才能找到全部的提交信息。因此,这个负责提测的人员...... git-log-as-object模块允许异步收集本地git信息库中任何范围的提交提交元数据。 gitLog(选项?:选项):Promise <Commit> 异步获取特定参考范围内所有提交的元数据。 options :包含函数可选参数的对象。 请参见下面的“选项参数”。 一个承诺对象数组的承诺,其中包含范围内每个提交的元数据。 (请参阅下面的提交格式。) gitLogSync(options ?: Options):提交[] 同步获取特定参考范围内所有提交的元数据。 options :包含函数可选参数的对象。 请参见下面的“选项参数”。 包含范围内每个提交的元数据的Commit对象数组。 (请参阅下面的提交格式。) Options对象具有以下属性,所有这些属性都可能是undefined : const LCL = require ( 'last-commit-log' ) ; const lcl = new LCL ( ) ; // or `new LCL(dir)` dir is process.cwd() by default 异步使用,使用Promise: . getLastCommit ( ) . then ( commit => console . log ( commit ) ) ; 同步使用: const commit = lcl . getLastCommitSync ( ) ; 提交信息是一个像这样的对象: " gitTag " : " 2.0 bin/控制台 gitlog:branch [path_to_repo] 显示 repo 的分支。 bin/控制台 gitlog:commit [path_to_repo] 显示或导日志。 该命令支持以下参数: --limit=[(int)limit]:默认情况下它只显示/导最后一次提交。 使用此参数来定位更多提交。 --start=[(int)start]:提交的起始偏移量。 --format=[array|json|md|console]:导的格式。 默认情况下,导显示到控制台。 如果选择了 md 格式,它会在目标 repo 中创建一个名为“gitlog”的目录,并将提取/结构化的注释保存到其中。 写入日志消息 为了让 gitlog提交消息中提取有用的信息,提交消息需要遵循一组简单的规则:
    git log 日志命令——显示提交日志语法描述版本表示git archive -o 文件名.zip <commit>--format=<格式> 选项——指定压缩格式-l --list 选项——列可用格式--prefix=<前缀>/ 选项——添加目录前缀-o <文件> --output=<文件> 选项——指定输文件名--add-file=<文件> 选项——添加未跟踪文件[--] <路径> ——限制路径 git l
    git-commit-lint-vscode 在日常的开发中,目前主流的代码管理工具就是 git 了,当我们对代码进行改动了,首先得git commit提交到本地仓库,git 规定了提交时必须填写提交信息作为改动说明,保存 commit 历史中,可以找到历史代码,也方便他人 review,还可以输 CHANGELOG,对项目的研发质量都有很大的提升。 但是在平时的工作中,大部分对于commit 都是简单的填写,没有好好的重视,这对于项目管理和维护来说,无疑是不友好的。这个插件就是规范化git提交规范,让你的提交不仅"好看"还"实用" git 规范提交从何说起? git 规范提交从哪里开始的呢?起源在哪呢?emmmmmm,这就追溯到了Angular了! 让我们看下Angular社区的提交规范 这个提交记录是不是一目了然?所以git commit规范下还是很有必要的! 命令行界面 Usage: git-log-to-json|git log-to-json <dir> Print a configurable git log in json Options: -h, --help output usage information -V, --version output the version number -H, --hash output the commit hash -D, --date output the commit date -N, --author-name output the commit author nam
    四行详细记录,包括的信息有commit id、提交者、提交时间、备注 git log --pretty=oneline 输的每个提交记录只占据一行,每行的显示内容为commit id + 备注 (HEAD -> master)指向的地方表示当前版本 通过log命令我们可以找到想要的版本的commit id git relog 通过relog命令可以读取 我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常 106817
    【我的OpenGL学习进阶之旅】解决着色器运行报错:ERROR: 0:32: ‘texture2D‘ : type is for Vulkan api only weixin_61314473: 大佬有没有用过mars3D 要怎么升级GLSL 3.0 【我的Android进阶之旅】解决java.lang.RuntimeException: Camera is being used after Camera.release() was called 【我的Android进阶之旅】NDK开发:如何通过一个自定义的编译参数来动态区分是否需要编译指定模块的代码以及是否链接额外的第三方库