让 MSYS2 Bash 像 Git Bash 一样显示 Git 分支名称
Git for Windows 的 Bash 有一个很实用的功能,如果当前目录处于 Git 仓库中,那么命令行中会显示当前 Git 分支的名称(见下图)。

然而原版的 MSYS2 Bash 没有这个功能(见下图),不过我们可以自己动手配置出相同的效果。

配置方法
打开 MSYS2 的家目录,找到 .bashrc 文件,在其中插入以下代码:
function parse-git-branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
function prompt-sign() {
net session > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "#" # administrator
else
echo "$" # common user
fi
}
export PS1="\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[35m\]$MSYSTEM \[\e[33m\]\w\[\e[36m\]\$(parse-git-branch)\012\[\e[0m\]$(prompt-sign) "
接着,关闭并重新打开命令行窗口,或者在命令行中执行 source ~/.bashrc 命令,即可看到更改后的效果(见下图)。

原理
上述代码通过修改 PS1 这个 shell 环境变量来配置命令提示符,PS 是 prompt string 的缩写。MSYS2 的 PS1 的默认值是 \[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[35m\]$MSYSTEM\[\e[0m\] \[\e[33m\]\w\[\e[0m\]\n\$ 。在 PS1 中,以反斜杠开头的字符有特殊含义,例如:
\u:用户名\h:主机名\w:当前目录\n:换行\$:对 root 用户显示#,对普通用户显示$
更多相关内容参见 Controlling the Prompt (Bash Reference Manual)。
PS1 支持用 ANSI 转义序列(ANSI escape code)配置文本的颜色,详见 ANSI escape code - Wikipedia。
了解了 PS1 的相关规则后,自定义命令提示符就不是一件难事了。写一个获取 Git 分支名称的函数 parse-git-branch,然后用 \$(parse-git-branch) 将分支名称插入 PS1 中即可。请注意双引号字符串中 $(expr) 和 \$(expr) 的区别,如果用的是 $(expr) 语法,则只会在第一次读取变量时对 expr 求值一次,如果用的是 \$(expr) 语法,则每次读取变量时都会对 expr 求值。由于我们希望每次更改目录后都重新读取 Git 分支的名称,因此应使用 \$(expr) 语法。
到了这里你会碰到 MSYS2 的一个 BUG,在 \$(parse-git-branch) 之后使用 \n 换行会报如下的错误:
bash: unexpected EOF while looking for matching `)'
这个 Stack Overflow 回答给了一种变通的办法,使用 \012(换行符的 ASCII 码)来代替 \n 即可。
接下来你会碰到 MSYS2 的另一个 BUG。正常来说,当以管理员身份运行 MSYS2 Bash 时会显示一个 #(见下图),当以普通用户身份运行时则显示一个 $,这与 Linux Bash 面对 root 用户/普通用户的行为十分相似。

前文提到,可以在 PS1 中使用 \$ 为 root 用户和普通用户显示不同的提示符号。但是不知何故 MSYS2 不支持这个功能,始终显示的是 $,所以需要额外写一个函数判断当前是否为管理员身份(即上面的 prompt-sign 函数),我用的是这个回答中的方法。
让 MSYS2 Bash 像 Git Bash 一样显示 Git 分支名称的更多相关文章
- Git使用总结(包含Git Bash和Git GUI的使用)(转自CSDN)
基本命令 初始化设置 配置本机的用户名和Email地址 $ git config --global user.name "Your Name" $ git config --glo ...
- Git详解之六 Git工具(转)
Git 工具 现在,你已经学习了管理或者维护 Git 仓库,实现代码控制所需的大多数日常命令和工作流程.你已经完成了跟踪和提交文件的基本任务,并且发挥了暂存区和轻量级的特性分支及合并的威力. 接下来你 ...
- git 命令参考手册 git中文命令参考手册大全
git init # 初始化本地git仓库(创建新仓库)git config --global user.name "xxx" # 配置用户名git config --global ...
- Git详解之六 Git工具
以下内容转载自:http://www.open-open.com/lib/view/open1328070367499.html Git 工具 现在,你已经学习了管理或者维护 Git 仓库,实现代码控 ...
- 《Pro Git》第3章 分支
1.分支简介 git保存的不是文件的差异,而是不同时刻的文件快照 git仓库中的对象: commit对象:包含指向前一个commit的指针的所有提交信息 树对象:记录目录结构和blob对象索引 blo ...
- git 使用命令删除远程分支和本地分支
删除远程分支命令: git push origin :<远程分支名称> git push origin --delete <远程分支名称> 删除本地分支: git bran ...
- git 使用merge 对本地分支进行合并 并进行代码提交的流程
1.只有当将修改内容commit后 该修改才完全生效,进行merge前需要将两个分支修改的内容都进行commit 2.假设本地两个分支 用于开发的分支:dev 用于同步远程仓库的分支:mas ...
- windows下git bash显示中文
1.C:\Program Files\Git\etc\git-completion.bash: alias ls='ls --show-control-chars --color=auto' 说明:使 ...
- git bash中不能显示中文
git bash中不能显示中文 问题描述:当使用git log查看提交日志时,中文字符不能正常显示问题 1.首先把git的配置改一下 git config --global core.quotepat ...
- Git------解决右键不显示Git Bash Here问题
步骤: 1.通过在“运行”中输入‘regedit’,打开注册表. 2.找到[HKEY_CLASSES_ROOT\Directory\Background]. 3.在[shell]下右键-新建项[ope ...
随机推荐
- letcode刷题记录-day01-两数之和
题目:两数之和 描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- 【单元测试】Junit 4(三)--Junit4断言
1.0 前言 断言(assertion)是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果--当程序执行到断言的位置时,对应的断言应该为真.若断言 ...
- VBA---文件操作
Text文件操作 Workbooks.OpenText() 载入一个文本文档,并将其作为包含单个工作表的新工作簿进行分列处理. 语法: 表达式.OpenText(Filename,StartRow, ...
- 修改Oracle共享池大小
1. sysdba登录数据库 [oracle@ufdb165 ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.4.0 Production on Wed Au ...
- C#使用附加到进程调试
微软官网的调试进程介绍 首先运行bin下的可执行文件,然后打开源代码,选择调试--->附加到进程.
- Git 实战代码分支管理 | Git Flow 策略
简介 在团队协作开发中,版本管理工具尤为重要,它可以帮助团队很好地进行代码的共享.回滚等操作,比较流行的版本管理工具有:CVS.SVN.Git.Git作为分布式版本管理工具,优势十分明显,它可以为 ...
- 2022春每日一题:Day 23
题目:Piotr's Ants 蚂蚁转头走,其实可以看做他们交换灵魂后接着往前走,同样发现,既然他们的速度相同,那么在数轴上相对位置不会改变(碰面会改变方向),那就好办了. 先把初始状态排序,id都记 ...
- orcle恢复报错:ORA-00392: 日志 2 (用于线程 1) 正被清除, 不允许操作
遇到问题 RMAN> alter database open resetlogs; RMAN-00571: =========================================== ...
- 基于python的数学建模---场线与数值解(微分方程)
import numpy as np from scipy import integrate import matplotlib.pyplot as plt import sympy def plot ...
- 动态规划篇——DP问题
动态规划篇--DP问题 本次我们介绍动态规划篇的DP问题,我们会从下面几个角度来介绍: 区间DP 计数DP 树状DP 记忆化搜索 区间DP 我们通过一个案例来讲解区间DP: /*题目展示*/ 题目名: ...