Отображение ветки Git и статуса в командной строке Bash
Настройка промпта Bash для мгновенного отображения контекста Git
Хорошо настроенный bash-промпт, отображающий информацию о git-репозитории может значительно упростить ваш рабочий процесс разработки.
Вместо постоянного выполнения команд git status и git branch, вы можете всегда видеть эту критически важную информацию в вашем терминальном промпте.

Пример промпта 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— личная тема создателя с полной интеграцией gitpowerline.omp.json— классический стиль powerlineatomic.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
- Проверьте, что git-prompt.sh загружен: Запустите
type __git_ps1в вашем терминале. Если он говорит “not found”, скрипт не загружен. - Проверьте права доступа: Убедитесь, что git-prompt.sh читаем:
ls -l /path/to/git-prompt.sh - Проверьте, что вы находитесь в репозитории git: Запустите
git statusдля подтверждения - Проверьте синтаксис PS1: Убедитесь, что
$(__git_ps1)включен и правильно обозначен
Цвета не отображаются
- Проблемы с последовательностями экранирования: Цвета в PS1 должны быть обернуты в
\[ \]для предотвращения проблем с переносом строки - Поддержка терминала: Убедитесь, что ваш терминал поддерживает ANSI-цвета:
echo -e "\033[31mRed Text\033[0m" - Коды сброса: Всегда заканчивайте последовательности цветов кодом сброса
\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"'
Лучшие практики и рекомендации
- Сохраняйте читаемость: Не перегружайте подсказку слишком большой информацией
- Используйте цвета стратегически: Разные цвета для разных состояний (чистое vs грязное)
- Тестируйте в разных сценариях: Убедитесь, что подсказка работает в обычных директориях, git-репозиториях и во время git-операций
- Документируйте вашу конфигурацию: Комментируйте ваш .bashrc, чтобы помнить, что делает каждая часть
- Резервируйте вашу конфигурацию: Версионируйте ваши dotfiles в git-репозитории. Если вы запускаете собственный git-сервер, возможно, стоит изучить Gitea server installing как легковесную самодостаточную опцию
- Учитывайте ваш рабочий процесс: Включайте только те функции, которые вам действительно нужны
- Используйте современные инструменты, когда возможно: Starship и подобные инструменты хорошо протестированы и производительны
Для самодостаточных git-решений узнайте о Gitea Backup and Restore для защиты ваших репозиториев. Если вас интересует автоматизация ваших git-рабочих процессов, изучите наш GitHub Actions cheatsheet для комплексного CI/CD-автоматизации.
Полезные ссылки
- Официальная документация Git по git-prompt.sh
- Официальный сайт Starship Prompt
- Официальная документация Oh My Posh
- Галерея тем Oh My Posh
- Bash Hackers Wiki - Настройка PS1
- Репозиторий Oh My Bash на GitHub
- Репозиторий Bash-git-prompt на GitHub
- Официальный сайт Nerd Fonts
- Справочник ANSI Escape Code
- Советы по производительности Git для больших репозиториев