git status和git push扩展脚本
1、对git status扩展使用方法
我们先来看看效果:
在之前的时候,我是用git status
查看工作区的变化,我想看某个文件的变化必须使用git diff file_abs_path
,必须要输入文件的相对目录。每次都输入我觉得很是费劲。
所以我想了个办法,写个脚本git_st
其实是我对shell脚本起了别名,我把放在.bashrc中,alias git_st=source git_status.sh
。
如果你clone了platypus项目直接执行install脚本就可以了,在source ~/.bashrc
,使配置文件生效。
使用方法:
$ git_st
$ git diff $dolphin_cpp
原理:
就是先遍历所有已经修改过的文件,向bash 中写入环境变量。变量名就是文件+后缀名,值就是文件的绝对路径。在使用git diff
的时候,再引用写入的环境变量,比如:$dolphin_cpp,这样就可以了。
再仔细看下脚本:
#!/bin/bash
RED='\e[1;31m' # 红
RES='\e[0m'
GREEN='\033[32m'
GREEN_END='\033[0m'
function echo_red {
echo -e "${RED}$1${RES}"
}
function echo_green {
echo -e "${GREEN}$1${GREEN_END}"
}
var_list=()
function update_var {
suffix=1
newstr=$1
# 解决文件可能重名,如果重名则添加后缀方式解决
while [[ "${var_list[*]}" =~ $newstr ]]
do
newstr="$newstr""_""$suffix"
suffix=$(($suffix+1))
done
var_list+=("$newstr")
export "$newstr=$2"
echo_red "$newstr=$2"
}
top_dir_path=`git rev-parse --show-toplevel`
# 获取 git status 输出的有变化的文件名,并保存到数组 files 中
files=( $(git status --porcelain | tee /dev/tty | awk '{print $2}') )
echo ""
if [ ${#files[@]} -eq 0 ]; then
echo_green "Not find any modified file"
else
echo_green "setting envirnoment variable start: "
# 遍历文件列表,设置环境变量
for file in "${files[@]}"
do
origin_file_name="$(basename "$file")"
file_name="$(basename "$file")"
if [[ $file_name == .* ]]; then
IFS='.'
arr=($file_name)
unset IFS
# 遍历数组中的每个元素
file_name="${arr[1]}"
else
# 提取出文件名(不含后缀)
file_name="${file_name%%.*}"
fi
# 设置环境变量
if [[ $origin_file_name = *.* ]]; then
file_name="$file_name""_""${origin_file_name##*.}"
fi
update_var "$file_name" "$top_dir_path/$file"
done
echo_green "setting envirnoment variable end: "
fi
unset RED
unset RES
unset GREEN
unset GREENEND
2、git push扩展
我在使用过程中发现,我的仓库可能有多个远程服务器,每次git push gitee && git push github && git push home,很是费劲。
所以写了个脚本直接在bash输入一个命令:git_push
。
看下效果:
在使用这个命令之前,你要确定你的本地分支已经和远程分支关联了。
这个push.sh脚本寥寥数行,但是省事多了。
remote_names=`git remote`
# 遍历所有Git远程仓库的名称并打印它们
for name in ${remote_names}
do
git push $name
done