Как я могу отобразить текущую ветку и путь к папке в терминале?

Я смотрел некоторые видеоролики 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


person sergserg    schedule 27.06.2013    source источник


Ответы (15)


Дело не в плагине. Речь идет о подсказках в оболочке.

Если вам нужна крутая настройка в 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 есть еще больше вкусностей.

person janos    schedule 27.06.2013
comment
После этого я получаю: bash: parse_git_branch: command not found - person Sharikov Vladislav; 03.09.2017
comment
@SharikovVladislav Есть новости по этому поводу? Как решить parse_git_branch: command not found? - person SilentDev; 25.02.2019
comment
Чтобы исправить ошибку parse_git_branch, вы должны определить функцию как: parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ \1/' } - person bc1105; 08.10.2019
comment
parse_git_branch предположительно был скопирован отсюда: gist.github.com/joseluisq/1e96c54fa4e1e5647940 - person Tom Lord; 15.10.2019

Простой способ

Откройте ~/.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)

person 6LYTH3    schedule 01.12.2013
comment
Мне понравилось это с \n перед знаком $ в конце, чтобы поместить мое приглашение на следующую строку. - person Gandalf458; 17.03.2014
comment
На полную настройку ушло 5 минут! Вот цвета: misc.flogisoft.com/bash/tip_colors_and_formatting - person rndrfero; 06.03.2018

Для тех, кто ищет, как это сделать в 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='%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

person romiem    schedule 14.10.2019
comment
Работает без нареканий, я это ценю. - person Sam Orozco; 13.03.2020
comment
Это прекрасно работает - спасибо, что написали это. Позор zsh не может работать как другие bash! - person giran; 02.07.2020
comment
Где я могу найти файл .zshrc? Я нахожусь в своем домашнем каталоге или /Users/myusername, но если я запускаю ls -lah, я не вижу его в списке - также нет .bashrc или .bash_profile. Единственные связанные файлы, которые я вижу, это .bash_history и .zsh_history. - person ltdev; 21.08.2020
comment
@ltdev Этот файл не обязательно существует по умолчанию, потому что это необязательный файл. Если его еще нет, то вам нужно создать файл с помощью команды touch .zshrc (в вашем домашнем каталоге) - person romiem; 21.08.2020
comment
Я в Биг-Суре, и впервые появляется цвет, и все работает, ЗА ИСКЛЮЧЕНИЕМ ветка git все еще не отображается. :( По крайней мере, это продвинуло меня дальше, чем раньше! Ура, цвета! - person cbloss793; 07.01.2021
comment
Итак, сказав это, я пошел, чтобы добавить ветку git в строку состояния iterm, и там было написано недопустимый путь git. После того, как я это исправил, ваше решение сработало. СПАСИБО! Вот исправление: apple.stackexchange.com/questions/254380/ - person cbloss793; 07.01.2021
comment
Круто, это то, что я искал, спасибо! - person Kelderth; 11.01.2021
comment
Это работало на M1 Mac. Спасибо !! - person Amit; 05.05.2021

Чтобы расширить существующие отличные ответы, очень простой способ получить красивый терминал — использовать проект 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-скрипт установки.
person sergserg    schedule 07.02.2015
comment
любые идеи о том, как обратить это вспять ?? - person ChickenWing24; 09.09.2015
comment
найти способ изменить это @ChickenWing24 ? - person ollaollu; 06.06.2016
comment
@ollaollu я в некотором роде изменил это. это было давно, поэтому не могу вспомнить шаги на 100%. но я в основном удалил все файлы/папки, связанные с этим репо. - person ChickenWing24; 07.06.2016
comment
хорошо, спасибо, сделал что-то похожее на это, и это сработало - person ollaollu; 08.06.2016
comment
следует отметить, что эта однострочная запись потенциально может перезаписать множество файлов, поэтому будьте осторожны. - person Ali Torbati; 19.05.2017
comment
ВНИМАНИЕ: не используйте мои настройки вслепую, если вы не знаете, что это влечет за собой. Используйте на свой риск! - person Jahanzaib Aslam; 21.08.2017
comment
СПОСОБ ОБРАТНОЙ РЕВЕРСИИ: сбросить настройки терминала до настроек по умолчанию =0 - person Jahanzaib Aslam; 21.08.2017
comment
это работает со мной, но почему после ввода любой команды он информирует меня об игнорировании расширения UNTR, игнорировании расширения UNTR, игнорировании расширения UNTR - person Astm; 09.11.2017
comment
Это добавляет ТОННЫ конфигураций, даже не заботясь о создании резервной копии файлов, которые он записывает. - person user180940; 09.08.2018
comment
Это экстремальный шаг, который нанесет ущерб всем вашим настройкам. - person michaeljsalo; 24.07.2019
comment
это опасно, потратил много времени на реверс - person chetan dev; 14.09.2019
comment
Я нашел ярлык, чтобы изменить это. Введите файл brew.sh и замените все упоминания install на purge и запустите снова. - person nilon; 25.06.2020

Моя подсказка включает:

  • Выход из состояния последней команды (если не 0)
  • Отличительные изменения при корне
  • rsync-стиль user@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
person Tom Hale    schedule 04.08.2016
comment
Это удивительно чистый код для информационной подсказки. Я провел много часов, работая над своей подсказкой и выбираясь из ловушек, чтобы получить в основном то, что вы здесь имеете. Я настоятельно рекомендую начать с этого кода, если вы работаете с пользовательским, раскрашенным статусом git в приглашении. - person wisbucky; 12.03.2017
comment
Спасибо вам, Том, это, безусловно, самое чистое и легко модифицируемое решение, с которым я столкнулся. @wisbucky был абсолютно прав - person jofrev; 22.03.2020

Просто установите плагины oh-my-zsh, как описано в этой ссылке.

введите здесь описание изображения

Лучше всего работает на macOS и Linux.

Базовая установка

Oh 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 -)"
person amy2719    schedule 25.10.2018

В 2019 году я думаю, что git branch --show-current - лучшая команда, чем принятый ответ.

$ git branch --show-current
master

(Добавлено в выпуске git 2.22 в июне 2019 г.)

Он работает намного быстрее, так как ему не нужно перебирать все ветки. Точно так же следует избегать 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
person ssppjj    schedule 23.10.2019
comment
Отличный ответ в 2019 году. Принятый и получивший наибольшее количество голосов ответ показывает их возраст. - person Akin Okegbile; 23.10.2019

Для 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 '
person ridox    schedule 16.11.2020

Пакет 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
person Chadversary    schedule 27.06.2013

Существует много генераторов PS1, но ezprompt также имеет статус git (2-я вкладка «Элементы состояния»).

person Anver Sadhat    schedule 28.02.2019

Основываясь на ответе 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, установить с помощью этого. Я использовал вариант через Homebrew на Mac OS X.

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"

Надеюсь, это поможет, хорошего дня!

person Jose Paez    schedule 16.04.2019
comment
спасибо за скрипт, это хорошо работает в моей Ubuntu 19.10. - person PallavSharma; 20.01.2020
comment
Рад помочь! Я использую сын Mac, что означает, что он работает как для Mac, так и для некоторых Ubuntu. - person Jose Paez; 02.06.2020

В 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, что тоже работает.

person Sreedhu Madhu    schedule 25.05.2020
comment
следующее сообщение появляется после этого меняется и не работает -› zsh compinit: insecure directories, run compaudit for list. Ignore insecure directories and continue [y] or abort compinit [n]? - person jose920405; 29.07.2020
comment
Где я могу найти файл .zprofile? Я нахожусь в своем домашнем каталоге или /Users/myusername, но если я запускаю ls -lah, я не вижу его в списке - также нет .bashrc или .bash_profile или .zshrc. Единственные связанные файлы, которые я вижу, это .bash_history и .zsh_history. - person ltdev; 21.08.2020

Держите это быстро, держите это просто

поместите это в свой ~/.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

введите здесь описание изображения

person casonadams    schedule 07.08.2020

для тех, кто все еще ищет это, я только что установил ohmyz https://ohmyz.sh/#install и ветки, которые он показывает введите здесь описание изображения

person maali    schedule 30.01.2021

В новой ОС Catalina для 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 $

person Vinoth Anandan    schedule 12.03.2021