git hooks 实践
一个简单的需求, 每次push之前 都将version 文件的版本号加一, 然后一起push 想到了 hooks, 最后实践过程中发现在
pre-push中 不能 git commit 也就是说pre-push只能 pushgit push之前的所有commit 就算你在pre-push中 进行了 commit 操作 但是最终pre-push中的commit 并不会被提交
pre-push 尝试
# pre-push
#!/bin/bash
increment_versiovn ()
{
declare -a part=( ${1//\./ } )
declare new
declare -i carry=1
for (( CNTR=${#part[@]}-1; CNTR>=0; CNTR-=1 ));
do
len=${#part[CNTR]}
new=$((part[CNTR]+carry))
[ ${#new} -gt $len ] && carry=1 || carry=0
[ $CNTR -gt 0 ] && part[CNTR]=${new: -len} || part[CNTR]=${new}
done
new="${part[*]}"
echo -e "${new// /.}"
}
master_branch='master'
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [ $current_branch = $master_branch ];then
version=$(cat ./version)
cat /dev/null > ./version
echo $(increment_versiovn $version) > ./version
git add ./version
git commit ./version -m "update version: $(increment_versiovn $version)"
exit 0
else
exit 0
fi
上面pre-push hooks 会在 master 分支 push 的时候 将版本号加一, 并且生成一个commit, 但是本次commit并不会被push
自定义脚本
既然不能通过
pre-push自动操作,那就只能写一个脚本手动操作一下了
#!/bin/bash
# build_version.sh
increment_versiovn ()
{
declare -a part=( ${1//\./ } )
declare new
declare -i carry=1
for (( CNTR=${#part[@]}-1; CNTR>=0; CNTR-=1 ));
do
len=${#part[CNTR]}
new=$((part[CNTR]+carry))
[ ${#new} -gt $len ] && carry=1 || carry=0
[ $CNTR -gt 0 ] && part[CNTR]=${new: -len} || part[CNTR]=${new}
done
new="${part[*]}"
echo "${new// /.}"
}
version=$(cat ./version)
cat /dev/null > ./version
echo $(increment_versiovn $version) > ./version
# 将 "\n" -> "\r\n" 为了去除 windows 下 git 的行尾修改警告
sed -i "s/$/\r/g" ./version
git add ./version
git commit ./version -m "update version: $(increment_versiovn $version)"
git push
echo "build version and push successfully!"
在每次push前 执行一下./build_version.sh 就可以实现自动增加版本号并且push到远程