我在Git仓库中管理我的Jekyll博客。 我的发布过程使用2个分支:
-
master
包含所有生产内容 -
feature/newposts
有新的博客文章,准备发布, 每个帖子一次提交
要发布现有帖子:
- 我在
feature/newposts
分支中检查了要发布的帖子 - 然后,获取关联的提交
- 樱桃在
master
分支中挑选 - 最后,我推
虽然没有那么慢,但这却很无聊。 这篇文章解释了我如何使用bash magic“自动化”上述过程。
日期
Bash用户知道如何获取当前日期:
date
输出:
Sun Aug 5 12:15:23 CEST 2018
但是,Jekyll博客文章文件名的格式为2018-08-05-xxx-yyy-zzz.adoc
。 看一下手册页,相关语法为:
date + '%Y-%m-%d'
它输出预期的字符串:
2018-08-05
路径
要获取Git树中文件的路径,需要使用git ls-tree
命令:
git ls-tree-r feature/newposts | grep`date + '%Y-%m-%d'`
这样产生:
100644 blob 2cb14109c9a41b67609b93a9fea904735d082a5c _posts/2018-08-05-spring-boot-integration-intellij-idea.adoc
请注意,哈希是Blob的哈希,而不是提交的哈希。 从这一点出发,有两种方法:
- 用这个blob获取提交
- 使用此路径获取提交
出于没有真正的原因,我选择了第二个选项。
仅获取路径,需要剪切输出:
git ls-tree-r feature/newposts | grep`date + '%Y-%m-%d'` | cut-c54-
现在可以正确打印:
_posts/2018-08-05-spring-boot-integration-intellij-idea.adoc
承诺
git log
是用于获取特定路径的提交的命令。 它允许一个分支选项。
git log feature/newposts--$( git ls-tree -r feature/newposts | grep`date + '%Y-%m-%d'` | cut-c54-)
输出:
commit dcc9dc60dc7ee615f35703c9a8e696d2dcae6d41 Author: Nicolas Fränkel < [email protected] > Date: Sun Apr 1 23:36:20 2018 +0200 Add Spring Boot integration in IntelliJ IDEA post Fix #25
要将输出限制为提交值,请使用--format
选项:
git log feature/newposts--format= %H --$( git ls-tree -r feature/newposts | grep`date + '%Y-%m-%d'` | cut-c54-)
结果是:
dcc9dc60dc7ee615f35703c9a8e696d2dcae6d41
樱桃采摘
最后一步是挑选相关的提交。 在这一点上,这是显而易见的:
git cherry-pick$( git log feature/newposts --format= %H --$( git ls-tree -r feature/newposts | grep`date + '%Y-%m-%d'` | cut-c54-))
最后一点
我没有找到cherry-pick
插入特定分支的方法,因此无法将提交添加到当前分支。
上面的命令只需要添加到master
分支的结账,然后返回即可。
git checkout master&&\
git cherry-pick $( git log feature/newposts --format= %H --$( git ls-tree -r feature/newposts | grep`date + '%Y-%m-%d'` | cut-c54-))&&\
git checkout -
git发布
#!/bin/bash
git checkout master &&\
git cherry-pick $( git log feature/newposts --format= %H --$( git ls-tree -r feature/newposts | grep`date + '%Y-%m-%d'` | cut-c54-))&&\
git checkout -
此时,可以像下面这样调用脚本:
git publish