在Unix-like系统中,如OSX和Ubuntu,经常需要执行一些重复的Git操作,例如推送当前分支到远程仓库并创建Pull Request。为了简化这个过程,可以编写一个Bash脚本来自动化这些操作。本文将介绍如何编写这样一个脚本,并解释其工作原理。
首先,需要定义一些颜色常量,以便于在终端中输出更易读的信息。
GREEN='\033[0;32m'
RESET='\033[0m'
接下来,定义一个名为gpr的函数,用于推送当前分支并尝试打开Pull Request页面。
gpr() {
# 获取当前分支名称,如果无法获取,则使用'HEAD'
branch=$(git symbolic-ref -q HEAD)
branch=${branch##*/}
branch=${branch:-HEAD}
# 推送过程可能需要一些时间,因此通知用户正在工作
echo "正在推送分支 ${GREEN}${branch}${RESET}..."
# 推送到远程仓库,捕获输出并回显
push_output=$(git push origin -u ${branch} 2>&1)
echo "$push_output"
# 如果输出中包含http,则可能是GitHub/GitLab等的链接,尝试打开它
link=$(echo $push_output | grep -o 'http.*' | sed -e 's/[[:space:]]*$//')
if [ -n "${link}" ]; then
echo "正在打开: ${GREEN}${link}${RESET}..."
python -mwebbrowser "${link}"
fi
}
这个脚本的工作原理如下:
首先,定义了两个颜色常量,用于在终端输出中设置绿色和重置文本颜色。
然后,定义了gpr函数。需要推送当前分支,因此首先获取当前分支的名称。使用git symbolic-ref命令获取当前分支的符号名称,例如refs/heads/my-new-branch。然后,使用Bash字符串替换功能去除refs/heads/部分。如果没有分支(例如,处于分离HEAD状态),则使用HEAD作为分支名称。
接下来,输出当前要推送的分支名称,并执行推送操作,将所有输出存储在push_output变量中。2>&1是一个常见的Bash技巧,它确保将stderr(文件描述符2)的所有输出重定向到stdout(文件描述符1)。这意味着无论程序将输出写入stdout还是stderr,都能捕获它。
Git推送的输出将取决于使用的Git服务器。对于GitHub,它可能看起来像这样:
remote:
remote: 创建Pull Request
remote:
remote: 通过访问以下链接在GitHub上为'feat/doc-cleanup'创建Pull Request:
remote: https://github.com/dwmkerr/dotfiles/pull/new/feat/doc-cleanup
remote:
To github.com:dwmkerr/dotfiles
* [new branch] feat/doc-cleanup -> feat/doc-cleanup
Branch feat/doc-cleanup set up to track remote branch feat/doc-cleanup from origin.
现在,只需要检查是否有任何文本以http开头,如果有,那么它很可能是GitHub/GitLab等的链接,然后尝试打开它。使用grep命令提取从http开始的所有内容,并使用sed命令去除任何尾随的空白字符。如果找到了链接,使用python命令打开它(这是一个相当安全的跨平台解决方案)。
就是这样!当有一个准备好要推送并创建Pull Request的分支时,只需运行gpr命令,分支将被推送到origin,如果有Pull Request网页,它将被打开。
git push 并直接在Chrome中打开PR - 适用于 @github 和 @gitlab 🚀
这是如何设置的 👉
https://t.co/YfNTmdwTFt
#github #gitlab