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

时间:2013-06-27 02:20:55

标签: macos git terminal git-branch

我一直在观看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

15 个答案:

答案 0 :(得分:59)

这不是一个插件。这是关于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还有更多好东西。

答案 1 :(得分:50)

简单方法

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

ADD GIT BRANCH NAME TO TERMINAL PROMPT (MAC)

答案 2 :(得分:27)

要扩展现有的优秀答案,一个非常简单的方法就是使用开源的 Dotfiles 项目。

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. Git克隆回购。
  2. cd进入文件夹。
  3. 运行安装bash脚本。

答案 3 :(得分:11)

我的提示包括:

  • 最后一个命令的退出状态(如果不是0)
  • root
  • 时的独特更改
  • 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

答案 4 :(得分:5)

对于正在macOS Catalina(10.15)中寻找操作方法的人(这是不赞成使用bsh推荐使用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}%% '

答案 5 :(得分:2)

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

答案 6 :(得分:2)

只需按照this link中所述安装oh-my-zsh插件。

enter image description here

它在macOS和Linux上效果最佳。

基本安装

哦,通过在终端中运行以下命令之一来安装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 -)"

答案 7 :(得分:1)

有很多PS1生成器,但是ezprompt的状态也为git(第二个标签为“状态元素”)。

答案 8 :(得分: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

答案 9 :(得分:0)

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

您可以使用此list

自定义颜色

复杂的解决方案

另一种选择是使用Git Bash Prompt,并安装this。我在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"

希望这对您有帮助,祝您度过愉快的一天!

答案 10 :(得分:0)

从Mac OS Catalina .bash_profile替换为.zprofile

步骤1: 创建一个.zprofile

touch .zprofile

第2步:

nano .zprofile

在此行下面输入

source ~/.bash_profile

并保存(ctrl + o返回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也可以。

答案 11 :(得分: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

enter image description here

答案 12 :(得分: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 '

答案 13 :(得分:0)

对于仍在寻找这个的人,我刚刚安装了 ohmyz https://ohmyz.sh/#install 和它显示的分支 enter image description here

答案 14 :(得分:0)

在新的 Catalina OS for Mac 中,您需要更改

   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 $