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

我一直在观看一些 TeamTreehouse 的视频,当使用 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

How can my terminal show me some useful information of what branch I'm on, with colors to distinguish bits of the data I want? Is there some sort of de-facto plugin I haven't found yet?

我用的是 Mac OSX 10.8

202213 次浏览

这不是插件的问题,而是 shell 中的提示技巧。

要了解 bash 中的一个很酷的设置,请查看这个家伙的 dotfiles项目:

Https://github.com/mathiasbynens/dotfiles

要获得一个奇特的提示符,请在 ~/.bash_profile~/.bashrc中包含 .bash_prompt

为了得到与你的问题完全相同的提示,像这样改变 .bash_prompt末尾的 export PS1行:

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中有更多的好东西。

系统上安装的 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

很简单

在您喜欢的编辑器中打开 ~/.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)

要扩展现有的伟大答案,一个非常简单的方法来获得一个伟大的外观终端是使用开源 文件项目。

Https://github.com/mathiasbynens/dotfiles


enter image description here


在 OSX 和 Linux 上安装非常简单。

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

这将会是:

  1. 快去复制回购协议。
  2. cd放入文件夹。
  3. 运行安装 bash 脚本。

我的提示包括:

  • 最后一个命令的退出状态(如果不是0)
  • 当根时有明显的变化
  • rsync样式的 user@host:pathname用于复制粘贴良好性
  • Git 分支、索引、修改、未跟踪和上游信息
  • 颜色很漂亮

例如: Screenshot of my prompt in action 为此,在 ~/.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

只需按照 这个链接中的描述安装 oh-my-zsh插件。

enter image description here

它在 macOS 和 Linux 上工作得最好。

基本安装

Oh My Zsh 是通过在终端中运行下列命令之一安装的。您可以通过使用 curlwget的命令行来安装它。

通过卷曲

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 -)"

有许多 PS1生成器,但是 电子提示也有 git 状态(第2个选项卡“状态元素”)。

基于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.

您可以使用此 名单自定义颜色

精密解决方案

另一种选择是使用 GitBashPrompt,与 这个一起安装。我在 Mac OS X 上使用了这个选项。

git_prompt_list_themes看到的主题,但我不喜欢他们中的任何一个。

git_prompt_color_samples查看可用的颜色。

为了创建一个新的自定义主题,应该创建一个. 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"

希望这对你有帮助,祝你有美好的一天!

对于任何人寻找如何做到这一点,在 macOS Catalina 或以上(10.15 + 包括。Big Sur 11.0)已经不支持 bash 而支持 zsh,这里是我的。Zhrc 文件:

parse_git_branch() {
git branch 2> /dev/null | sed -n -e 's/^\* \(.*\)/[\1]/p'
}
COLOR_DEF='%f'
COLOR_USR='%F{243}'
COLOR_DIR='%F{197}'
COLOR_GIT='%F{39}'
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

在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

来自 Mac OS Catalina . bash _ profile 替换为. zprofile

第一步: 创建一个.zprofile

touch .zprofile

第二步:

nano .zprofile

在下面的行中键入

source ~/.bash_profile

然后保存(ctrl + o 返回 ctrl + x)

第三步: 重启你的终端

添加 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,这也是可行的。

快点,简单点

把这个放到你的 ~/.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

enter image description here

Mac Catilina 10.15.5及更高版本:

添加 ~/. zhrc 文件

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 '

对于任何还在找这个的人,我刚刚安装了 Ohmyz Https://ohmyz.sh/#install 和它显示的树枝 enter image description here

在新的 Catalina Mac 操作系统中

I) 方式。在 .zshrc中加入以下行

parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/'
}
COLOR_DEF='%f'
COLOR_DIR='%F{197}'
COLOR_GIT='%F{33}'
setopt PROMPT_SUBST
export PROMPT='${COLOR_DIR}%1d${COLOR_DEF}${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ '

Ii)或使用旧的 Bash,你需要更改

   System Preference -> Users & Groups -> Right click user user
-> Advanced Option -> Login shell -> /bin/bash

像下面这样编写. bash _ profile 并重新启动系统

parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/'
}
export PS1="\W\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "

输出: FolderName BranchName $

做了一些搜索,然后调整了一下,解决了这个问题。

vi ~/.zshrc

并在 zhrc 文件->

function git_branch_name()
{
branch=$(git symbolic-ref HEAD 2> /dev/null | awk 'BEGIN{FS="/"} {print $NF}')
if [[ $branch == "" ]];
then
:
else
echo '- ('$branch')'
fi
}
setopt prompt_subst
prompt='%n %1/ $(git_branch_name) $ '

在卡特琳娜及以上,你可以打开你的。通过运行 nano ~/.zshrc,并在文档顶部张贴以下内容,可以获得 zhrc 文件:

# Show git branch in terminal
function 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;220m’
COLOR_GIT=$'\e[38;5;39m'
setopt PROMPT_SUBST
export PROMPT='${COLOR_USR}%n ${COLOR_DIR}%~
${COLOR_GIT}$(parse_git_branch)${COLOR_DEF} $ '

退出并保存。重新启动您的终端,或运行 exec zsh,这应该是它。

或者

你可以看看这个主题,看看你是否喜欢。它真的很容易安装,而且在我看来看起来很不错:

Https://github.com/romkatv/powerlevel10k#configuration

希望能帮上忙。

对于 macOS:

第一步:

创建和编辑将用于终端配置的 .zshrc文件。

touch ~/.zshrc; open ~/.zshrc

第二步:

把这个添加到你的 ~/.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 '