前言
平时开发过程中,如果项目体量较大,业务修改频繁,难免要新建很多分支,但是分支名通常较短,很难直观地告诉我们它到底是因为什么目的而被创建出来的。这时,我们可以给分支设置描述信息来解决这一问题。
正文
在git操作中,我们可以这样执行来设置分支描述信息:
$ git config YourBranchName.description "Your branch description 233"
这个操作实际上是在git的配置表中增加了一个配置变量,名字叫YourBranchName.description,它的值被赋值为Your branch description 233。
所以,本质就是在一个额外的小本本上记了一句话而已。
同理,读取信息就只需要这样就行:
$ git config YourBranchName.description
一般情况下,到这里就可以达到目的了。
但是,每次都敲这么长的命令不符合发展的潮流:懒惰是科技发展的助推剂。借助工具来完成麻烦的工作是很自然能想到的。网上常见的方式为使用git-br工具,但是安装这玩意儿需要用npm,太麻烦了,原则上这些操作可以自己写个简单的工具脚本解决。
遂根据原理,完成了如下bash脚本:
#!/bin/bash
# 脚本达成目的:轻松设置当前分支的描述信息;轻松获取所有分支的描述信息。
#
# 原理:
# 设置描述:git config YourBranchName.description [Your description]
# 获取描述:git config YourBranchName.description
#
# 让脚本更方便使用的方式:
# 在 ~/.bashrc中新增一行,为脚本设置别名: alias br=/home/wzj/OldHome/software/br.sh
# 注意替换br.sh的实际绝对路径,保存后执行source ~/.bashrc或者打开新终端后执行 br 命令就可以快捷调用本脚本。
# 1、直接执行br:打印分支名与分支描述信息,第一列为分支名,第二列为分支描述。例子如下:
# wzj@wzj-desktop:~$ br
# ---N | D---
# combined : 光学测试平台
# dev : 开发分支
# fix : 临时分支,频繁修改
# master : 主分支
# multiVolSys : 多体系配置选择实现方式重新优化
#pureWaterTankWatcher : 纯水箱自动补水功能
#
# 2、执行带参数的br即 “br [your description]”:给当前分支添加分支描述,然后打印所有分支描述。带空格时请将整个描述用单引号或双引号括起来。
# 例子如下(当前处于fix分支):
#wzj@wzj-desktop:~$ br "临时分支 (测试修改)"
# ---N | D---
# combined : 光学测试平台
# dev : 开发分支
# fix : 临时分支(测试修改)
# master : 主分支
# multiVolSys : 多体系配置选择实现方式重新优化
#pureWaterTankWatcher : 纯水箱自动补水功能
#
########################最后,刻意设计为不能给非当前分支设置描述#########################
#---下面开始实现---
# 当前分支
curBr=`git symbolic-ref --short -q HEAD`
# 如果输入了参数,且第一个命令行参数不为空值,则将该命令行参数作为描述信息写入到当前分支
if [ -n "$1" ]; then
newDes=$1 #获取输入的描述参数
if [ -n "$curBr" ]; then
git config $curBr.description "$newDes" #设置分支描述
fi
fi
result=`git branch` #罗列所有本地分支(不关心remote分支)
branches=() #分支结果集合
index=0 #分支数组索引,用来给数组增加成员
#从集合中遍历所有的分支结果
for things in $result
do
#忽略文件结果
if test -f "$things"
then
continue
fi
#忽略目录结果
if test -d "$things"
then
continue
fi
#分支存在则处理
if [ -n "$(git branch --list $things)" ]; then
#将分支名添加到新的索引下
branches[$index]=$things
#索引自增
index=`expr $index + 1`
fi
done
#获取分支名集合中名字最长的长度,用于最终结果美观打印
function maxBranchNameLen() {
max=0
maxIndex=0
maxLen=$index
for ((i=0;i<$maxLen;i++));do
len=${#branches[$i]}
if [ $len -gt $max ];then
max=$len
maxIndex=$i
fi
done
return $max
}
#执行获取最长名字长度
maxBranchNameLen $branches
maxLength=$(($?+2)) #后面加*号和空格,这里需要加2,否则当前分支为最长的分支时显示不对齐
#打印某一个分支的分支描述
function printDes() {
des=`git config $1.description`
brName="$1"
if [ "$brName" == "$curBr" ]; then
# 现在还能打印颜色了
printf "|\033[32m%+"$maxLength"s | %s\033[0m\n" "* $brName" "$des"
else
printf "|\033[31m%+"$maxLength"s | %s\033[0m\n" "$brName" "$des"
fi
}
#打印表头
printf "|\033[44m%+"$maxLength"s\033[0m | \033[44m%s\033[0m\n" Name Description
#打印结果列表
for br in ${branches[@]};do
printDes "$br"
done
#不在任何分支上,则获取当前的commit信息
if [ "$curBr" == "" ]; then
curBr="$(git log -1 --oneline)"
echo " 当前位置:" $curBr
fi
#完成