如何在终端中显示当前分支和文件夹路径?


73

我一直在观看Team Treehouse的一些视频,与Git一起使用时,它们的终端看起来非常漂亮。

例如,它们具有(类似):

mike@treehouseMac: [/Work/test - feature-branch-name] $ git add .
mike@treehouseMac: [/Work/test - feature-branch-name] $ git commit -m "Some feature."
mike@treehouseMac: [/Work/test - feature-branch-name] $ git checkout master
mike@treehouseMac: [/Work/test - master] $ git status

终端如何向我显示我在哪个分支上的有用信息,并用颜色区分我想要的数据位?我还没有找到某种事实上的插件吗?

我正在使用Mac OSX 10.8

Answers:


70

这与插件无关。这是关于shell中的提示技巧。

在bash中进行酷炫的设置,请查看dotfiles此人的项目:

https://github.com/mathiasbynens/dotfiles

要获得精美提示,请.bash_prompt~/.bash_profile或中添加~/.bashrc

要获得与您的问题完全相同的提示,请像这样更改export PS1结尾的行.bash_prompt

export PS1="\[${BOLD}${MAGENTA}\]\u\[$WHITE\]@\[$ORANGE\]\h\[$WHITE\]: [\[$GREEN\]\w\[$WHITE\]\$([[ -n \$(git branch 2> /dev/null) ]] && echo \" - \")\[$PURPLE\]\$(parse_git_branch)\[$WHITE\]] \$ \[$RESET\]"

.bash*大约一个月前,我最终使用了该存储库中的所有文件,这对我真的很有用。

对于Git来说,中还有其他好处.gitconfig

而且,由于您是Mac用户,因此中还有更多东西.osx


3
在此之后,我得到:bash: parse_git_branch: command not found
Sharikov Vladislav

@SharikovVladislav对此有任何更新吗?我们该如何解决parse_git_branch: command not found
user2719875

1
要纠正该parse_git_branch错误,您必须将函数定义为:parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/' }
bc1105

parse_git_branch大概是从这里复制的:gist.github.com/joseluisq/1e96c54fa4e1e5647940
Tom Lord

73

简单的方法

~/.bash_profile在您喜欢的编辑器中打开,然后在底部添加以下内容。

提示中的Git分支。

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

export PS1="\u@\h \[\033[32m\]\w - \$(parse_git_branch)\[\033[00m\] $ "

将Git分支添加到终端提示(Mac)


3
我喜欢在结尾加上$之前的\ n,将提示放在下一行。
Gandalf458

1
花了5分钟来完全自定义!颜色如下:misc.flogisoft.com/bash/tip_colors_and_formatting
rndrfero

41

对于希望在macOS Catalina或更高版本(10.15+包括Big Sur 11.0)或更高版本(已弃用bash推荐使用zsh)中进行操作的人,这是我的.zshrc文件:

parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}
COLOR_DEF=$'\e[0m'
COLOR_USR=$'\e[38;5;243m'
COLOR_DIR=$'\e[38;5;197m'
COLOR_GIT=$'\e[38;5;39m'
NEWLINE=$'\n'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n@%M ${COLOR_DIR}%d ${COLOR_GIT}$(parse_git_branch)${COLOR_DEF}${NEWLINE}%% '

如果您不喜欢我使用的颜色,请使用此处定义的颜色代码替换243/197/39值:https ://misc.flogisoft.com/bash/tip_colors_and_formatting


1
完美无缺,我对此表示赞赏。
山姆·奥罗斯科

效果很好-感谢您撰写本文。可耻的zsh不能像其他基础一样运行!
giran

在哪里可以找到.zshrc文件?我在主目录或/ Users / myusername上,但是如果运行ls -lah,则在列表中看不到它-也没有.bashrc或.bash_profile。我可以看到的唯一相关文件是.bash_history和.zsh_history
ltdev 20/08/21

3
@ltdev该文件默认情况下不一定存在,因为它是可选文件。如果尚不存在,则需要使用命令touch .zshrc(在您的主目录中)创建文件
-romiem

我在大苏尔(Big Sur),第一次出现颜色,除了git分支仍然不显示之外,其他所有功能都正常。:(至少这使我比以前更进一步了!是的颜色!
cbloss793

28

为了扩展现有的出色答案,获得美观终端的一种非常简单的方法是使用开源Dotfiles项目。

https://github.com/mathiasbynens/dotfiles


在此处输入图片说明


在OSX和Linux上,安装非常简单。在终端中运行以下命令。

git clone https://github.com/mathiasbynens/dotfiles.git && cd dotfiles && source bootstrap.sh

这将是:

  1. Git克隆仓库。
  2. cd 进入文件夹。
  3. 运行安装bash脚本。

7
关于如何扭转这种想法?
ChickenWing15年

3
应该注意的是,这种单线可能会覆盖很多文件,所以要小心
Ali Torbati

2
提醒:除非您知道其中的含义,否则不要盲目使用我的设置。使用风险自负!
Jahanzaib Aslam

4
这增加了TONS的配置,甚至无需备份它写入的文件。
user180940

2
这是一个极端的举动,会对您的所有设置造成破坏。
michaeljsalo

16

我的提示包括:

  • 上一条命令的退出状态(如果不为0)
  • 扎根时发生明显变化
  • rsyncuser@host:pathname粘贴粘贴的样式
  • Git分支,索引,已修改,未跟踪和上游信息
  • 漂亮的颜色

示例: 我的操作提示的屏幕截图 为此,将以下内容添加到您的中~/.bashrc

#
# Set the prompt #
#

# Select git info displayed, see /usr/share/git/completion/git-prompt.sh for more
export GIT_PS1_SHOWDIRTYSTATE=1           # '*'=unstaged, '+'=staged
export GIT_PS1_SHOWSTASHSTATE=1           # '$'=stashed
export GIT_PS1_SHOWUNTRACKEDFILES=1       # '%'=untracked
export GIT_PS1_SHOWUPSTREAM="verbose"     # 'u='=no difference, 'u+1'=ahead by 1 commit
export GIT_PS1_STATESEPARATOR=''          # No space between branch and index status
export GIT_PS1_DESCRIBE_STYLE="describe"  # detached HEAD style:
#  contains      relative to newer annotated tag (v1.6.3.2~35)
#  branch        relative to newer tag or branch (master~4)
#  describe      relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
#  default       exactly eatching tag

# Check if we support colours
__colour_enabled() {
    local -i colors=$(tput colors 2>/dev/null)
    [[ $? -eq 0 ]] && [[ $colors -gt 2 ]]
}
unset __colourise_prompt && __colour_enabled && __colourise_prompt=1

__set_bash_prompt()
{
    local exit="$?" # Save the exit status of the last command

    # PS1 is made from $PreGitPS1 + <git-status> + $PostGitPS1
    local PreGitPS1="${debian_chroot:+($debian_chroot)}"
    local PostGitPS1=""

    if [[ $__colourise_prompt ]]; then
        export GIT_PS1_SHOWCOLORHINTS=1

        # Wrap the colour codes between \[ and \], so that
        # bash counts the correct number of characters for line wrapping:
        local Red='\[\e[0;31m\]'; local BRed='\[\e[1;31m\]'
        local Gre='\[\e[0;32m\]'; local BGre='\[\e[1;32m\]'
        local Yel='\[\e[0;33m\]'; local BYel='\[\e[1;33m\]'
        local Blu='\[\e[0;34m\]'; local BBlu='\[\e[1;34m\]'
        local Mag='\[\e[0;35m\]'; local BMag='\[\e[1;35m\]'
        local Cya='\[\e[0;36m\]'; local BCya='\[\e[1;36m\]'
        local Whi='\[\e[0;37m\]'; local BWhi='\[\e[1;37m\]'
        local None='\[\e[0m\]' # Return to default colour

        # No username and bright colour if root
        if [[ ${EUID} == 0 ]]; then
            PreGitPS1+="$BRed\h "
        else
            PreGitPS1+="$Red\u@\h$None:"
        fi

        PreGitPS1+="$Blu\w$None"
    else # No colour
        # Sets prompt like: ravi@boxy:~/prj/sample_app
        unset GIT_PS1_SHOWCOLORHINTS
        PreGitPS1="${debian_chroot:+($debian_chroot)}\u@\h:\w"
    fi

    # Now build the part after git's status

    # Highlight non-standard exit codes
    if [[ $exit != 0 ]]; then
        PostGitPS1="$Red[$exit]"
    fi

    # Change colour of prompt if root
    if [[ ${EUID} == 0 ]]; then
        PostGitPS1+="$BRed"'\$ '"$None"
    else
        PostGitPS1+="$Mag"'\$ '"$None"
    fi

    # Set PS1 from $PreGitPS1 + <git-status> + $PostGitPS1
    __git_ps1 "$PreGitPS1" "$PostGitPS1" '(%s)'

    # echo '$PS1='"$PS1" # debug    
    # defaut Linux Mint 17.2 user prompt:
    # PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[00m\] $(__git_ps1 "(%s)") \$ '
}

# This tells bash to reinterpret PS1 after every command, which we
# need because __git_ps1 will return different text and colors
PROMPT_COMMAND=__set_bash_prompt

2
对于信息密集的提示,这是非常干净的代码。我花了很多时间在提示上工作,并摆脱了陷阱,基本上得出了您在这里遇到的问题。如果在提示上处理自定义,彩色,git状态,我强烈建议从此代码开始。
Wisbucky

1
为您提供支持Tom,这是我遇到的最干净,最容易修改的解决方案。@wisbucky绝对正确
jofrev

11

只需oh-my-zsh按照此链接中所述安装插件。

在此处输入图片说明

它在macOS和Linux上效果最佳。

基本安装

哦,通过在终端中运行以下命令之一来安装My Zsh。您可以使用curl或在命令行中安装它wget

通过卷曲

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

通过wget

sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

3

安装在系统上的git软件包包括bash文件,以帮助您创建信息提示。要创建颜色,您将需要在提示中插入终端转义序列。并且,最后的要点是在使用内置变量PROMPT_COMMAND执行每个命令之后更新提示。

编辑〜/ .bashrc以包括以下内容,您应该在问题中得到提示,并对一些颜色差异取模。

#
# Git provides a bash file to create an informative prompt. This is its standard
# location on Linux. On Mac, you should be able to find it under your Git
# installation. If you are unable to find the file, I have a copy of it on my GitHub.
#
# https://github.com/chadversary/home/blob/42cf697ba69d4d474ca74297cdf94186430f1384/.config/kiwi-profile/40-git-prompt.sh
#
source /usr/share/git/completion/git-prompt.sh

#
# Next, we need to define some terminal escape sequences for colors. For a fuller
# list of colors, and an example how to use them, see my bash color file on my GitHub
# and my coniguration for colored man pages.
#
# https://github.com/chadversary/home/blob/42cf697ba69d4d474ca74297cdf94186430f1384/.config/kiwi-profile/10-colors.sh
# https://github.com/chadversary/home/blob/42cf697ba69d4d474ca74297cdf94186430f1384/.config/kiwi-profile/40-less.sh
#
color_start='\e['
color_end='m'
color_reset='\e[0m'
color_bg_blue='44'

#
# To get a fancy git prompt, it's not sufficient to set PS1. Instead, we set PROMPT_COMMAND,
# a built in Bash variable that gets evaluated before each render of the prompt.
#
export PROMPT_COMMAND="PS1=\"\${color_start}\${color_bg_blue}\${color_end}\u@\h [\w\$(__git_ps1 \" - %s\")]\${color_reset}\n\$ \""

#
# If you find that the working directory that appears in the prompt is ofter too long,
# then trim it.
#
export PROMPT_DIRTRIM=3


1

基于6LYTH3的回答,由于一些方便的改进,我决定发布自己的答案:

简单的解决方案

打开~/.bash_profile并添加以下内容

# \[\e[0m\] resets the color to default color
reset_color='\[\e[0m\]'
#  \[\033[33m\] sets the color to yellow
path_color='\[\033[33m\]'
# \e[0;32m\ sets the color to green
git_clean_color='\[\e[0;32m\]'
# \e[0;31m\ sets the color to red
git_dirty_color='\[\e[0;31m\]'

# determines if the git branch you are on is clean or dirty
git_prompt ()
{
  # Is this a git directory?
  if ! git rev-parse --git-dir > /dev/null 2>&1; then
    return 0
  fi
  # Grab working branch name
  git_branch=$(git branch 2>/dev/null| sed -n '/^\*/s/^\* //p')
  # Clean or dirty branch
  if git diff --quiet 2>/dev/null >&2; then
    git_color="${git_clean_color}"
  else
    git_color="${git_dirty_color}"
  fi
  echo " [$git_color$git_branch${reset_color}]"
}

export PS1="${path_color}\w\[\e[0m\]$(git_prompt)\n"

这应该:

1) Prompt the path you're in, in color: path_color.
2) Tell you which branch are you.
3) Color the name of the branch based on the status of the branch with git_clean_color 
for a clean work directory and git_dirty_color for a dirty one.
4) The brackets should stay in the default color you established in your computer.
5) Puts the prompt in the next line for readability.

您可以使用此列表自定义颜色

精密的解决方案

另一个选择是使用Git Bash Prompt,并与此一起安装。我在Mac OS X上通过Homebrew使用了该选项。

git_prompt_list_themes 看主题,但我不喜欢其中任何一个。

git_prompt_color_samples 查看可用的颜色。

git_prompt_make_custom_theme [<Name of base theme>] 要创建新的自定义主题,应创建一个.git-prompt-colors.sh文件。

subl ~/.git-prompt-colors.sh 打开git-prompt-colors.sh并自定义:

我自定义的.git-prompt-colors.sh文件应如下所示

    override_git_prompt_colors() {
      GIT_PROMPT_THEME_NAME="Custom"

      # Clean or dirty branch
      if git diff --quiet 2>/dev/null >&2; then
        GIT_PROMPT_BRANCH="${Green}"
      else
        GIT_PROMPT_BRANCH="${Red}"
      fi
    }

    reload_git_prompt_colors "Custom"

希望这会有所帮助,祝您有美好的一天!


感谢您的脚本,这在我的ubuntu 19.10中很好用。
PallavSharma

很高兴有帮助!我使用Mac儿子,这意味着它适用于Mac和某些Ubuntu
Jose Paez

1

在2019年,我认为git branch --show-current比接受的答案更好。

$ git branch --show-current
master

(在2019年6月的git 2.22版本中添加)

它运行得更快,因为它不需要遍历所有分支。同样git branch,在命令提示符下也应避免,因为如果您有许多本地分支,它会降低提示符速度。

将其放在函数中以在命令提示符下的任何位置使用:

  # This function returns '' in all below cases:
  #   - git not installed or command not found
  #   - not in a git repo
  #   - in a git repo but not on a branch (HEAD detached)
  get_git_current_branch() {
    git branch --show-current 2> /dev/null
  }

更多内容:

$ git version
git version 2.23.0

2019年的最佳答案。被接受和最受好评的答案表明了他们的年龄。
Akin Okegbile

0

从Mac OS Catalina中将.bash_profile替换为.zprofile

步骤1:建立.zprofile

touch .zprofile

第2步:

nano .zprofile

在此行下键入

source ~/.bash_profile

并保存(ctrl + o return ctrl + x)

步骤3:重新启动终端

添加Git分支名称 现在,您可以在.bash_profile中添加以下行

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

export PS1="\u@\h \[\033[32m\]\w - \$(parse_git_branch)\[\033[00m\] $ "

重新启动您的终端,这将起作用。

注意: 即使您可以将.bash_profile重命名为.zprofile也可以。


在更改后下一条消息出现,并且不起作用->zsh compinit: insecure directories, run compaudit for list. Ignore insecure directories and continue [y] or abort compinit [n]?
jose920405 '20

在哪里可以找到.zprofile文件?我在主目录或/ Users / myusername上,但是如果运行ls -lah,则在列表中看不到它-也没有.bashrc或.bash_profile或.zshrc。我可以看到的唯一相关文件是.bash_history和.zsh_history
ltdev 20/08/21

0

保持快速,简单

将此放入您的~/.bashrc文件中。

git_stuff() {
  git_branch=$(git branch --show-current 2> /dev/null)
  if [[ $git_branch == "" ]];then
    echo -e ""
  elif [[ $git_branch == *"Nocommit"* ]];then
    echo -e "No commits"
  else
    echo -e "$git_branch"
  fi
}
prompt() {
  PS1="\e[2m$(date +%H:%M:%S.%3N) \e[4m$(git_stuff)\033[0m\n\w$ "
}
PROMPT_COMMAND=prompt

然后 source ~/.bashrc

在此处输入图片说明


0

对于Mac Catilina 10.15.5和更高版本:

添加您的〜/ .zshrc文件

function parse_git_branch() {
    git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}

setopt PROMPT_SUBST
export PROMPT='%F{grey}%n%f %F{cyan}%~%f %F{green}$(parse_git_branch)%f %F{normal}$%f '
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.