问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在终端实时展现git分支

发布网友 发布时间:2022-05-16 18:50

我来回答

1个回答

热心网友 时间:2023-11-23 09:29

  在微博上看到ghosTM55在终端可以实时展现出当前运行的分支,觉得很奇特,于是google了一把。这里面存在两个内容,第一个bash,第二个是git

  

  

  bash基础:

  

  了解到linux的shell存在PS1, PS2,PS3, PS4,这些都作为环境变量存在。

  

  PS1表示的默认交互提示,在ubuntu-12.04中的默认值是 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$",也就是我们通常可以看到的:

  damon@damon:~/pyenv/bin$

  在PS1中

  \u -- 表示用户名

  \h -- 表示主机名

  \w -- 当前目录的全局路径,如果是home目录,显示~

  \s -- 表示的bash

  \v -- 表示版本

  

  所以你可以修改默认的提示符:

  export PS1="\u@\h-\v \w> "

  按照上面的提示,显示的就是

  damon@damon-4.2 ~/pyenv/bin

  

  通常情况下,我们只会用到PS1,但是当我们需要继续交互的时候,就会用到PS2,比方说输入命令行使用\来进行下一行处理。例如简单一些:

  ls \

  则会出现下面的提示符号,也就是PS2的内容

  >

  通常我们会用到的就这两个

  

  shell在执行PS1前,会先执行PROMPT_COMMAND这个指令,并且显示在PS1之前。所以我们可以在终端的PROMPT_COMMAND上做一些操作

  然后得到显示一些特殊的内容,也就是ghosTM55上实时显示git分支。

  

  我们先试验一下,修改PROMPT_COMMAND为下面的值:

  export PROMPT_COMMAND="echo -n [$(date +%H:%M:%S)]"

  那么提示符号将显示为:

  [21:40:17]damon@damon:~/pyenv/bin$

  注意时间是定格的

  

  可以使用unset方法来取消PROMPT_COMMAND

  

  git基础:

  

  git是存在分支的,当前所在的git分支可以通过git branch来察看。

  

  另外一种方式,获取.git/HEAD文件中的内容,格式是:

  ref: refs/heads/BRANCH-NAME

  

  

  于是有两种方案:

  

  一,用下面指令替换PS1

  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'

  

  但是存在问题,那就是每次shell活动,都要启动一个git和sed的进程,开销会有些大。

  

  二、先定义一个git分支的查询方式:

  复制代码
  function find_git_branch {
  local dir=. head
  until [ "$dir" -ef / ]; do
  if [ -f "$dir/.git/HEAD" ]; then
  head=$(< "$dir/.git/HEAD")
  if [[ $head == ref:\ refs/heads/* ]]; then
  git_branch=" ${head#*/*/}"
  elif [[ $head != '' ]]; then
  git_branch=' (detached)'
  else
  git_branch=' (unknown)'
  fi
  return
  fi
  dir="../$dir"
  done
  git_branch=''
  }
  复制代码
  然后用下面的方法替换:

  PROMPT_COMMAND="find_git_branch; $PROMPT_COMMAND"
  当然最后我们可以用下面的方式替换PS1

  green=$'\e[1;32m'
  magenta=$'\e[1;35m'
  normal_colours=$'\e[m'

  PS1="\[$green\]\u@\h:\w\[$magenta\]\$git_branch\[$green\]\\$\[$normal_colours\] "

  这样就可以在PS1中的颜色知道当前的状态。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电视般有哪些尺寸 电视有哪些尺寸 寓意生命力顽强的男孩名字 美国产生金融危机了,铁矿石回降价吗? 铁矿石什么情况下会跌 从生物学的角度看,随地吐痰的主要危害是什么 随地吐痰会给我们带来什么样的危害? 痰是怎样形成的,随地吐痰有哪些危害 得力挂钟为什么不走了 人民大学、外交学院、中国政法、北京大学、复旦、华东政法等大学法学... 余罪中沈嘉文的扮演者是谁? 特务迷城中饰演嘉文的是谁? 妈妈向前冲冲冲演员 富士xf56mm f1.2会降价吗 浑南新区的建制沿革 英语本科自考要考哪几门? 沈阳理工大学附近有什么公交? EpE1是什么板 在SDH光传输设备中 我问一下去苏家屯去浑南麦子屯村做什么车能到啊。 请教下光纤传送网与SDH传输网的区别与联系? 东湖街道的历史沿革 SDH就是光线吗? 沈阳市浑南区刘付屯22年拆迁吗 201年自考本科毕业了,毕业证还没发放,能报考2012年湖北公务员吗? 沈阳北站到浑南麦子屯安博物流园怎么走? sdh光传输拓扑图和结构图有什么区别 201年自考在哪里报名? 在五爱市场到浑南麦子屯安博物流园怎么走 我想请问下,小自考本科考过了之后还要不要去学校读书?听说小自考201 沈阳浑南新市府到浑南麦子屯有多远 使命召唤OL坠机之地是哪个图改的 grow的名词是什么? &quot;光面PU&quot; 是什么?是不是光面人造革?是不是价格应该很便宜? cod17有坠机之地吗 镜面pu定型定皱了要怎么样恢复 使命召唤ol坠机之地怎么跳矮墙 grow各种词性形式? 塑胶表面PU喷涂如何检测?如何区分直啤光面与PU喷涂面? 《使命召唤OL》丧尸生存模式中坠机地图BUG点 grow 是动词还是名词? 余罪中大嫂的扮演者 grow和increase的区别是什么? 镜面PU和皮U哪个比较透气? 使命召唤ol 坠机之地的进攻以及防守,蹲点等团队合作技巧。 详细一点,谢谢 有一个男演员,常演抗日、谍战电视剧,小眼睛、大鼻子,感觉个子很高,有点像于震,擅演硬汉形象,他叫啥 管理费用是有那些组成? 使命召唤OL坠机之地卡楼梯刀趴哪个位置比较合适 盖玻片是玻璃的还是塑料的啊 坠机之地出现在使命召唤哪一部 如何将git的master分支整个替换为另外一个分支