Отображение ветки Git и статуса в командной строке Bash

Настройка промпта Bash для мгновенного отображения контекста Git

Содержимое страницы

Хорошо настроенный bash-промпт, отображающий информацию о git-репозитории может значительно упростить ваш рабочий процесс разработки.

Вместо постоянного выполнения команд git status и git branch, вы можете всегда видеть эту критически важную информацию в вашем терминальном промпте.

oh-my-posh

Пример промпта oh-my-push.

Почему стоит добавить информацию о Git в ваш Bash-пrompt?

Когда вы работаете с несколькими git-репозиториями и ветками в течение дня, переключение контекста становится значительным фактором снижения продуктивности. Git-осведомленный промпт решает несколько распространенных проблем:

  • Предотвращает путаницу с ветками: Вы всегда будете знать, на какой ветке находитесь перед коммитом
  • Снижает нагрузку на команды: Нет необходимости постоянно выполнять git status и git branch
  • Непосредственная визуальная обратная связь: Видите несохраненные изменения, неотслеживаемые файлы и статус удаленного репозитория
  • Меньше ошибок: Избегайте случайного коммита в неправильную ветку или отправки “грязного” кода

Понимание переменной Bash PS1

Bash-пrompt управляется переменной окружения PS1. Эта переменная может содержать:

  • Литеральный текст: Любые символы, которые вы хотите отобразить
  • Последовательности экранирования: Специальные коды, начинающиеся с \, которые отображают динамическую информацию
  • Подстановка команд: Команды в $(...) которые выполняются и отображают их вывод
  • ANSI-коды цветов: Последовательности экранирования, которые изменяют цвет текста

Распространенные последовательности экранирования PS1 включают:

  • \u - текущее имя пользователя
  • \h - имя хоста
  • \w - текущий рабочий каталог
  • \$ - # для root, $ для обычного пользователя
  • \t - текущее время в 24-часовом формате

Базовый промпт может выглядеть так: PS1='\u@\h:\w\$ ' и производить вывод вида user@hostname:/path/to/dir$. Для более подробного изучения основ bash и последовательностей экранирования, ознакомьтесь с нашим подробным Bash Cheat Sheet.

Метод 1: Использование встроенного скрипта git-prompt.sh

Распространения Git включают вспомогательный скрипт под названием git-prompt.sh, который предоставляет функцию __git_ps1. Это наиболее надежный и функциональный подход.

Поиск git-prompt.sh

Сначала найдите, где находится скрипт на вашей системе:

# Распространенные расположения на Linux
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt

# Распространенные расположения на macOS (с Homebrew)
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

# Поиск, если необходимо
find /usr -name git-prompt.sh 2>/dev/null

Базовая настройка

Добавьте следующее в ваш ~/.bashrc или ~/.bash_profile:

# Подключение скрипта git-prompt
source /usr/lib/git-core/git-sh-prompt

# Настройка промпта для отображения информации о git
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '

Часть $(__git_ps1 " (%s)") вызывает функцию, и %s заменяется на текущее имя ветки. Окружающие пробелы и скобки форматируют его красиво.

После редактирования перезагрузите вашу конфигурацию:

source ~/.bashrc

Дополнительные возможности git-prompt.sh

Git-prompt.sh становится мощным инструментом, когда вы включаете его необязательные функции через переменные окружения:

# Показывать несохраненные (*) и сохраненные (+) изменения
export GIT_PS1_SHOWDIRTYSTATE=1

# Показывать, если есть застекленные изменения ($)
export GIT_PS1_SHOWSTASHSTATE=1

# Показывать, если есть неотслеживаемые файлы (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1

# Показывать разницу между HEAD и upstream
# Варианты: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"

# Включить цветные подсказки (требуется bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1

# Показывать состояние репозитория во время операций
# (MERGING, REBASING, BISECTING и т.д.)
export GIT_PS1_DESCRIBE_STYLE="default"

Вот что означают индикаторы:

  • * - Несохраненные изменения (измененные файлы, не добавленные)
  • + - Сохраненные изменения (файлы добавлены, но не закоммичены)
  • $ - Существуют застекленные изменения
  • % - Наличие неотслеживаемых файлов
  • < - Отстает от ветки upstream
  • > - Опережает ветку upstream
  • <> - Расходится с веткой upstream
  • = - Равен ветке upstream

Полная примерная конфигурация

Вот всеобъемлющая конфигурация ~/.bashrc:

# Подключение git-prompt
if [ -f /usr/share/git-core/contrib/completion/git-prompt.sh ]; then
    source /usr/share/git-core/contrib/completion/git-prompt.sh
fi

# Настройка опций git-prompt
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1

# Определения цветов
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]'      # Зеленый
COLOR_PATH='\[\033[01;34m\]'      # Синий
COLOR_GIT='\[\033[01;33m\]'       # Желтый

# Настройка промпта
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "

Метод 2: Ручная подстановка команд Git

Если у вас нет доступа к git-prompt.sh или вы хотите минимальное решение, вы можете напрямую выполнять команды git в вашем промпте:

# Простое отображение имени ветки
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '

# Имя ветки с индикатором состояния
parse_git_dirty() {
    [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit, working tree clean" ]] && echo "*"
}

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

PS1='\u@\h:\w\[\033[01;33m\]$(parse_git_branch)\[\033[00m\]\$ '

Этот подход более переносим, но уступает по функциональности git-prompt.sh и может быть медленнее в больших репозиториях.

Метод 3: Современные инструменты для подсказок

Для более богатого опыта с минимальной настройкой рассмотрите эти современные альтернативы:

Starship Prompt

Starship — это быстрая, настраиваемая подсказка, написанная на Rust, которая работает в нескольких оболочках (bash, zsh, fish, PowerShell).

# Установка Starship
curl -sS https://starship.rs/install.sh | sh

# Добавление в ~/.bashrc
eval "$(starship init bash)"

Starship автоматически обнаруживает репозитории git и отображает:

  • Имя ветки
  • Хэш коммита при отсоединенном состоянии
  • Состояние репозитория (слияние, ребейз и т.д.)
  • Количество измененных файлов
  • Состояние опережения/отставания от удаленного репозитория
  • И многое другое с настраиваемыми иконками

Настройте его через ~/.config/starship.toml:

[git_branch]
symbol = "🌱 "
format = "on [$symbol$branch]($style) "

[git_status]
conflicted = "🏳"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
untracked = "🤷"
stashed = "📦"
modified = "📝"
staged = '[++\($count\)](green)'
renamed = "👅"
deleted = "🗑"

Oh My Bash

Oh My Bash — это фреймворк для управления конфигурацией bash с темами и плагинами:

# Установка Oh My Bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"

# Редактирование ~/.bashrc для установки темы
OSH_THEME="powerline"

Многие темы Oh My Bash включают интеграцию с git по умолчанию.

Oh My Posh

Oh My Posh — это современный, кроссплатформенный движок подсказок, который работает с bash, zsh, PowerShell и другими оболочками. Он предоставляет красивые, настраиваемые подсказки с отличной интеграцией git и использует Nerd Fonts для поддержки иконок.

Установка на Linux

Установите Oh My Posh с помощью одной команды:

# Установка в ~/bin или ~/.local/bin (по умолчанию)
curl -s https://ohmyposh.dev/install.sh | bash -s

# Или укажите кастомную директорию установки
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin

Базовая настройка

Добавьте Oh My Posh в ваш ~/.bashrc:

# Инициализация Oh My Posh с темой
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"

Установка и использование тем

Oh My Posh включает множество готовых тем. Сначала скачайте их:

# Создание директории тем
mkdir ~/.poshthemes

# Скачивание всех тем
curl -s https://ohmyposh.dev/themes.json | \
  jq -r '.[] | .url' | \
  xargs -I {} sh -c 'curl -s {} -o ~/.poshthemes/$(basename {})'

Популярные темы включают:

  • jandedobbeleer.omp.json — личная тема создателя с полной интеграцией git
  • powerline.omp.json — классический стиль powerline
  • atomic.omp.json — минималистичный с основной информацией
  • night-owl.omp.json — цветная тема с подробной информацией о git

Переключите темы, изменив путь конфигурации:

eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"

Возможности git

Oh My Posh автоматически отображает подробную информацию о git:

  • Текущее имя ветки
  • Количество коммитов опережения/отставания от удаленного репозитория
  • Состояние рабочей директории (чистая/грязная)
  • Количество сохраненных изменений
  • Состояние слияния/ребейза
  • Информация о тегах
  • Хэш коммита в состоянии detached HEAD

Кастомная конфигурация

Создайте кастомную тему, скопировав существующую:

# Копирование темы как точки отсчета
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json

# Редактирование вашей темы
nano ~/.mytheme.omp.json

# Использование вашей кастомной темы
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"

Пример конфигурации сегмента git в JSON:

{
  "type": "git",
  "style": "powerline",
  "powerline_symbol": "",
  "foreground": "#193549",
  "background": "#fffb38",
  "background_templates": [
    "{{ if or (.Working.Changed) (.Staging.Changed) }}#FF9248{{ end }}",
    "{{ if and (gt .Ahead 0) (gt .Behind 0) }}#ff4500{{ end }}",
    "{{ if gt .Ahead 0 }}#B388FF{{ end }}",
    "{{ if gt .Behind 0 }}#B388FF{{ end }}"
  ],
  "properties": {
    "fetch_status": true,
    "fetch_upstream_icon": true,
    "branch_icon": " ",
    "branch_max_length": 25,
    "truncate_symbol": "…"
  }
}

Требования к шрифтам

Oh My Posh работает лучше всего с Nerd Fonts для поддержки иконок:

# Скачивание и установка Nerd Font (пример: FiraCode)
mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts
curl -fLo "FiraCode Nerd Font.ttf" \
  https://github.com/ryanoasis/nerd-fonts/raw/HEAD/patched-fonts/FiraCode/Regular/FiraCodeNerdFont-Regular.ttf
fc-cache -fv

Затем настройте ваш терминал для использования Nerd Font.

Преимущества Oh My Posh

  • Кроссплатформенность: Одинаковая конфигурация работает на Linux, macOS и Windows
  • Быстрота: Написан на Go для производительности
  • Расширяемость: Модульные сегменты для git, времени, пути, языков, облачных провайдеров и т.д.
  • Богатые темы: Большая коллекция готовых тем
  • Активная разработка: Регулярные обновления и улучшения
  • Агностичность терминала: Работает в любом ANSI-совместимом терминале

Bash-git-prompt

Специализированный инструмент для bash-подсказок, ориентированный на информацию о git:

# Клонирование репозитория
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1

# Добавление в ~/.bashrc
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
    GIT_PROMPT_ONLY_IN_REPO=1
    source $HOME/.bash-git-prompt/gitprompt.sh
fi

Рассмотрение производительности в больших репозиториях

Операции git status могут быть медленными в больших репозиториях. Вот стратегии оптимизации:

Отключение дорогих функций выборочно

# В .bashrc, условно отключайте функции для больших репозиториев
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    repo_size=$(du -sh .git 2>/dev/null | cut -f1)
    # Отключите проверку состояния для репозиториев больше 100МБ
    if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
        export GIT_PS1_SHOWDIRTYSTATE=0
    fi
fi

Использование опций конфигурации git

Настройте git для оптимизации проверок состояния:

# Включите мониторинг файловой системы для более быстрых проверок состояния
git config core.fsmonitor true
git config core.untrackedCache true

# Для очень больших репозиториев рассмотрите частичные клоны
git config core.commitGraph true
git config gc.writeCommitGraph true

Альтернатива: Асинхронные подсказки

Инструменты вроде Starship используют асинхронные операции для предотвращения задержек подсказок. Подсказка обновляется после получения информации о git, а не блокирует выполнение.

Устранение распространенных проблем

Подсказка не отображает информацию о git

  1. Проверьте, что git-prompt.sh загружен: Запустите type __git_ps1 в вашем терминале. Если он говорит “not found”, скрипт не загружен.
  2. Проверьте права доступа: Убедитесь, что git-prompt.sh читаем: ls -l /path/to/git-prompt.sh
  3. Проверьте, что вы находитесь в репозитории git: Запустите git status для подтверждения
  4. Проверьте синтаксис PS1: Убедитесь, что $(__git_ps1) включен и правильно обозначен

Цвета не отображаются

  1. Проблемы с последовательностями экранирования: Цвета в PS1 должны быть обернуты в \[ \] для предотвращения проблем с переносом строки
  2. Поддержка терминала: Убедитесь, что ваш терминал поддерживает ANSI-цвета: echo -e "\033[31mRed Text\033[0m"
  3. Коды сброса: Всегда заканчивайте последовательности цветов кодом сброса \033[00m

Подсказка нарушает перенос строки

При использовании цветов непечатаемые последовательности экранирования должны быть обернуты в \[ и \]:

# Неправильно - вызывает проблемы с переносом строки
PS1="\033[32m\u\033[00m\$ "

# Правильно
PS1="\[\033[32m\]\u\[\033[00m\]\$ "

Медленная подсказка в WSL или сетевых дисках

Операции git на сетевых дисках Windows или WSL могут быть медленными:

# Отключите дорогие функции git-prompt на медленных файловых системах
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0

Рассмотрите использование нативного Windows Git bash вместо WSL для репозиториев на дисках Windows.

Интеграция с рабочими процессами разработки

Git-осведомленная подсказка становится еще мощнее, когда комбинируется с другими улучшениями оболочки:

Git-алиасы для быстрой навигации

Комбинируйте свою улучшенную подсказку с полезными git-алиасами для максимизации эффективности. Для полного списка команд git и сокращений посетите наш GIT commands cheatsheet.

# Добавьте в ~/.gitconfig или ~/.bashrc
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'

Условное поведение подсказки

# Разные цвета подсказки для разных состояний
__git_ps1_colorize() {
    local git_status="$(git status 2>/dev/null)"
    if [[ $git_status =~ "nothing to commit" ]]; then
        echo -e "\[\033[32m\]"  # Зеленый для чистого состояния
    else
        echo -e "\[\033[31m\]"  # Красный для грязного состояния
    fi
}

PS1='\u@\h:\w$(__git_ps1_colorize)$(__git_ps1 " (%s)")\[\033[00m\]\$ '

Интеграция с заголовком терминала

Обновляйте заголовок терминала с информацией о репозитории:

PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}$(__git_ps1 " [%s]")\007"'

Лучшие практики и рекомендации

  1. Сохраняйте читаемость: Не перегружайте подсказку слишком большой информацией
  2. Используйте цвета стратегически: Разные цвета для разных состояний (чистое vs грязное)
  3. Тестируйте в разных сценариях: Убедитесь, что подсказка работает в обычных директориях, git-репозиториях и во время git-операций
  4. Документируйте вашу конфигурацию: Комментируйте ваш .bashrc, чтобы помнить, что делает каждая часть
  5. Резервируйте вашу конфигурацию: Версионируйте ваши dotfiles в git-репозитории. Если вы запускаете собственный git-сервер, возможно, стоит изучить Gitea server installing как легковесную самодостаточную опцию
  6. Учитывайте ваш рабочий процесс: Включайте только те функции, которые вам действительно нужны
  7. Используйте современные инструменты, когда возможно: Starship и подобные инструменты хорошо протестированы и производительны

Для самодостаточных git-решений узнайте о Gitea Backup and Restore для защиты ваших репозиториев. Если вас интересует автоматизация ваших git-рабочих процессов, изучите наш GitHub Actions cheatsheet для комплексного CI/CD-автоматизации.

Полезные ссылки

Другие полезные статьи