首页 > 其他分享 >让 MSYS2 Bash 像 Git Bash 一样显示 Git 分支名称

让 MSYS2 Bash 像 Git Bash 一样显示 Git 分支名称

时间:2023-02-05 13:55:07浏览次数:50  
标签:git expr Git PS1 Bash MSYS2

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

git-bash-git-branch

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

msys2-no-git-branch

配置方法

打开 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 命令,即可看到更改后的效果(见下图)。

msys2-git-branch

原理

上述代码通过修改 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 用户/普通用户的行为十分相似。

msys2-admin-prompt-sign

前文提到,可以在 PS1 中使用 \$ 为 root 用户和普通用户显示不同的提示符号。但是不知何故 MSYS2 不支持这个功能,始终显示的是 $,所以需要额外写一个函数判断当前是否为管理员身份(即上面的 prompt-sign 函数),我用的是这个回答中的方法。

标签:git,expr,Git,PS1,Bash,MSYS2
From: https://www.cnblogs.com/zhb2000/p/msys2-git-branch-name.html

相关文章

  • Linux内网环境离线安装Git工具
    下载GitLinux下载地址:https://git-scm.com/download/linuxtar.gz包直链:https://www.kernel.org/pub/software/scm/git/git-2.36.1.tar.gz(注意版本号更新)解压tarxvf......
  • [CLI] Github workflow
    name:Developmentpipelineon:pull_request:branches:-mainjobs:Server:runs-on:ubuntu-22.04steps:-name:Checkfiles......
  • [Postgres Bash] Wait for database
    Serverwaitfordatabasegetready#Fromhttps://docs.docker.com/compose/startup-order/#!/bin/sh#wait-for-postgres.shset-ehost="$1"shift#Logi......
  • 怎么使用Git查看项目中代码的提交历史记录?
    怎么使用Git查看项目中代码的提交历史记录?可以在git上使用下面这段指令gitlog--pretty=format:"%ai,%an:%s">>~/Desktop/Readme.log在git上执行完之后,就可以在......
  • 简易的git命令行入门教程
    一、Git全局设置gitconfig--globaluser.name"用户名"gitconfig--globaluser.email"邮件地址@163.com"二、创建git仓库mkdir项目名cd项目名gitinitt......
  • 从一个Git PR看SONiC社区的开发
    开源软件的开发采用众人拾柴火焰高的模式,每一个有兴趣的参与者可以对代码的修改提出PullRequest,经过社区审核通过以后,所建议的修改可以被纳入到社区代码中。这里以一个SO......
  • Go Linux bash环境下 字符串strings.Trim截取无效
    result:="40%"iflen(result)>0{fmt.Println("result:",result)numStr:=strings.TrimSpace(strings.Trim(result,"%"))fmt......
  • 通过git删除文件夹
    #拉取分支到本地gitclone-bdev2.8xxxxxxxx#删除本地文件gitrm文件名#删除文件夹gitrm-rf文件夹名#加入注释gitcommit-m"加入注释"#查看远程origingitremotesh......
  • 本地文件push到git
    1.刚创建的本地文件,还未初始化,gitinit,会自动生成一个.git文件夹2.gitadd.将文件添加到缓存区3.gitcommit-m'commit的命名'4.创建新分支,直接将新分支的内容pus......
  • GitHub因为缺少‘公钥’而报错
    解决:GitHub因为缺少‘公钥’而报错报错:[email protected]:Permissiondenied(publickey).fatal:Couldnotreadfromremoterepository报错原因:-->缺少公钥导致......