[git管理]使用shell脚本和nodejs实现快速commit和打tag

思考

前端使用npm和git进行开发工作时,会有版本号或者变更需要同步更新提交。通过commit提交更新信息时,有时候我就在思考,是不是可以将commit信息利用起来,成为我们工作时变更的版本日志数据?

话不多说,码上分享。

使用方式

执行命令: sh bin/commit.sh

运行步骤

1.输入commit信息

2.选择更新类型

3.选择是否提交tag

实现方式

一、 创建相关文件

bin/commit.sh           //执行脚本
bin/commit.js           //日志文件更新
bin/version.js          //package.json版本更新
bin/version_log.json    //版本日志文件
package.json    //npm依赖配置文件

二、 关键代码

先带大家看一下版本日志文件 version_log.json

[
{
"date": "2021-01-01 00:00:00",
"version": "0.0.1",
"commit": "[更新]创建提交命令及更新日志脚本测试"
}
]

这是一个标准的json格式文件,通过数组将版本信息存入其中,因为我是将最新的版本放到数组尾部,所以每次只需要提取最后一个匹配到的version信息进行识别版本号操作

接下来是关键的sh命令,和开发者产生交互,由开发者填写本次的版本更新日志,选择更新版本的类型,以及是否进行tag标签提交的选项

#!/bin/bash
cd bin/
#=========读取最后一个版本信息=========
versions=($(cat ./version_log.json | awk -F 'version' '/version/{print$0}' | sed 's/ //g'  ))
versions_length=${#versions[@]}
newest_version_str=${versions[versions_length-1]}
newest_version_str_length=${#newest_version_str}
#获取字符后面索引值
newest_version_str_length_end=$[newest_version_str_length-2-11]
old_version=${newest_version_str:11:$newest_version_str_length_end}
versionArr=[]
v=${old_version//./ }
index=0
for i in $v; do
versionArr[index]=$i
index=$[index+1]
done
read -p  "请提交变动信息:" commit_msg
#=========执行更新类别选择(默认bug修复)=========
commitPrefix="[修复]"
echo "====== 1. 迭代 ======"
echo "====== 2. 更新  ======"
echo "====== 3. 修复 ======"
read -p  "请选择变动类型 (默认:3) :" level
case $level in
1)  echo '您已选择版本迭代'
versionArr[0]=$[versionArr[0]+1]
versionArr[1]=0
versionArr[2]=0
commit="[迭代]"$commit_msg
;;
2)  echo '您已选择小更新'
versionArr[1]=$[versionArr[1]+1]
versionArr[2]=0
commit="[更新]"$commit_msg
;;
3)  echo '您已选择修复'
versionArr[2]=$[versionArr[2]+1]
commit="[修复]"$commit_msg
;;
*)  echo '您已默认选择修复'
versionArr[2]=$[versionArr[2]+1]
commit="[修复]"$commit_msg
;;
esac
now_date=`date "+%Y-%m-%d_%H:%M:%S"`
echo $now_date
version=${versionArr[0]}'.'${versionArr[1]}'.'${versionArr[2]}
echo $version
addInfo="{\"date\":\"$now_date\",\"version\":\"$version\",\"commit\":\"$commit\"}"
#=========更新版本日志文件信息=========
node commit $addInfo
#同步更新package.json版本号
node version
git commit -am $commit
read -p  "是否添加Tag(Git)1/0:" is_add_tag
echo $is_add_tag
if(($is_add_tag == 1 ))
then
echo "您已选择推送Git标签,即将执行..."
git tag $version
git push origin --tags dev
else
echo "您未选择推送Git标签,即将结束..."
git push origin dev
fi
exit 1

然后是对两个json文件的读写操作node命令

commit.js

//增加更新系统日志功能
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const path = require("path");
const fs = require('fs')
var versionStr = ""
if (!process.argv[2]) {
process.exit()
return console.error('[打包通知]未获取到版本信息流,重写失败', err)
}
versionStr = process.argv[2]
fs.readFile(path.join(__dirname, './version_log.json'), (err, data) => {
if (err) {
process.exit()
return console.error("[打包通知]文件读取异常:" + err)
}
let packagesConfig = JSON.parse(data)
packagesConfig.push(JSON.parse(versionStr))
fs.writeFile(path.join(__dirname, './version_log.json'), JSON.stringify(packagesConfig), (err, result) => {
if (err) {
return console.error('[打包通知]version_log.json 重写失败', err)
}
process.exit()
return console.log('[打包通知]version_log.json 版本更新成功')
})
})

verison.js

const path = require("path");
const fs = require('fs')
fs.readFile(path.join(__dirname, '../package.json'), (readFilePackageError, packages) => {
if (readFilePackageError) {
process.exit()
return console.error("[打包通知]读取package.json错误:" + readFilePackageError)
}
let newVersion
fs.readFile(path.join(__dirname, './version_log.json'), (readFileLogError, logs) => {
if (readFileLogError) {
process.exit()
return console.error("[打包通知]读取开发日志发生错误:" + readFileLogError)
}
let logData = JSON.parse(logs)
newVersion = logData.pop().version
console.log('[打包通知]当前最新开发日志版本:V' + newVersion)
let packagesConfig = JSON.parse(packages)
packagesConfig.version = newVersion
fs.writeFile(path.join(__dirname, '../package.json'), JSON.stringify(packagesConfig), (err, result) => {
if (err) {
return console.error('[打包通知]package.json 重写失败', err)
}
process.exit()
return console.log('[打包通知]package.json 版本更新成功')
})
})
})

原创内容,未经允许禁止转载!

SegmentFault博客
我还没有学会写个人说明!
上一篇

外媒评选2020年游戏Top50:第一无悬念,《赛博朋克2077》名列第五

下一篇

研究人员提出有关净化滤水膜工作原理的新见解

你也可能喜欢

评论已经被关闭。

插入图片