Поиск по сайту:

Всегда знайте, в какой ветке Git вы находитесь, с помощью этого трюка с Linux


Ключевые выводы

  • Работать с ветками в Git быстро и легко, и нам рекомендуется делать это часто в качестве хорошей рабочей практики.
  • Поскольку это такой тривиальный процесс, смена ветки не всегда запоминается.
  • Измените командную строку так, чтобы она автоматически отображала текущую ветку Git, и вы всегда будете знать, в какой ветке вы находитесь.

Использовать ветки в Git настолько безболезненно, что мы делаем это часто. Настолько, что отслеживать вашу текущую ветку непросто. Благодаря этому трюку вы никогда не забудете свою текущую ветку.

Отслеживание ветвей Git

Ветви имеют решающее значение для контроля версий. Они позволяют вам работать над новыми функциями или вносить изменения в существующий код, не затрагивая основную ветку исходного кода.

Работать с ветками в Git проще простого по сравнению с другим программным обеспечением для контроля версий. Создание новых веток и изменение ветвей — очень легкие процессы, поэтому они происходят в мгновение ока. И поскольку это так быстро и просто, разработчики склонны делать это часто.

Это почти слишком просто. Поскольку Git делает изменение ветвей тривиальным делом, вы можете делать это почти так же бессознательно, как и менять каталоги. Но знать, в какой отрасли вы находитесь, очень важно.

Этот трюк помогает, показывая вашу текущую ветку Git в командной строке Bash. И самое интересное: если ваш текущий каталог не содержит репозитория Git, вы увидите обычную командную строку.

Получение вашей ветки Git в виде строки

Чтобы это работало, нам нужно иметь возможность получать текущую ветку Git в виде текстовой строки, которую мы вставляем в командную строку. Давайте выполним стандартную команду Git, чтобы получить список ветвей в репозитории.

git branch

Здесь перечислены все ветки репозитория. Текущая ветка, сохраненная игра, отмечена звездочкой. Удобно, что это единственная строка со звездочкой. Это означает, что мы можем передать вывод команды git в sed и использовать функции управления потоком команды sed для удаления строк без звездочки. Для единственной оставшейся строки мы можем использовать sed, чтобы удалить звездочку и пробел.

git branch | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'

Это дает нам имя текущей ветки. Есть более простые способы сделать это, но для полноты картины рассмотрим, как работает эта команда.

Выполняем стандартную команду git Branch.

git branch

Вывод передается в sed. Существует два выражения sed. Первое выражение удаляет строки, которые не содержат звездочку.

-e '/^[^*]/d'

Второе выражение удаляет ведущую звездочку и пробел из одной оставшейся строки.

-e 's/* \(.*\)/\1/'

Это работает, но не все знакомы с sed или знакомы с ним. Если вы посмотрите на это через шесть месяцев, будет ли это иметь какой-то смысл? Мы можем использовать git и Bash для разработки более простого метода.

Оператор && в Bash позволяет нам объединять команды так, чтобы они выполнялись одна за другой. Для выполнения команды в цепочке предыдущая команда должна завершиться успешно. Как мы увидим, мы можем использовать это с пользой.

Еще одна вещь, работающая в нашу пользу, заключается в том, что начиная с версии 2.2 в команде git Branch есть опция --show-current. Это отображает имя текущей ветки само по себе.

git branch --show-current

Это более простой способ получить простое имя текущей ветки Git. Единственная проблема заключается в том, что он генерирует сообщение об ошибке, если текущий каталог не содержит репозитория Git. Поэтому нам нужно убедиться, что команда не будет выполнена, если мы не находимся в репозитории Git.

Есть команда git, которая называется git status. Это сообщает о состоянии репозитория Git. Если команда завершается неудачно, как это происходит, если нет репозитория, о котором можно было бы сообщить, ее значение выхода равно 128.

git status
echo $?

В каталоге с репозиторием его значение выхода равно нулю.

git status
echo $?

Мы можем связать эту команду и нашу команду ветки git, чтобы команда ветки git выполнялась только в том случае, если команда git status возвращает ноль. Другая вещь, которую мы сделаем, — это перенаправим весь вывод на экран команды git status в /dev/null, псевдофайл, который молча поглощает все, что ему отправлено.

git status &> /dev/null && echo " $(git branch --show-current)"
cd taf
git status &> /dev/null && echo " $(git branch --show-current)"

Мы подавили весь вывод команды git status, а это именно то, что нам нужно. Внутри каталога, который не содержит репозитория, вывод на экран отсутствует. Внутри каталога, содержащего репозиторий, мы видим имя текущей ветки.

Мы могли бы просто позволить команде git Branch записать имя текущей ветки в окно терминала как есть, но, обернув его в команду echo, мы можем включить начальный пробел. Пробел будет отделять имя ветки от имени каталога в командной строке, чтобы его было легче увидеть с первого взгляда.

Добавление строки в строку Bash

Мы получили имя текущей ветки Git и можем вывести его на экран в формате с пробелом в начале. Теперь мы включим это в командную строку.

Мы создадим функцию для хранения команд, которые мы создали до сих пор, и будем вызывать эту функцию из определения командной строки. Всякий раз, когда отображается командная строка, будет вызываться наша функция.

В Bash определение командной строки обычно (но не всегда) находится в файле .bashrc. Это скрытый системный файл, расположенный в вашем домашнем каталоге.

Используйте свой любимый редактор для редактирования файла .bashrc.

Найдите строку, определяющую вашу командную строку. Обычно все начинается с:

PS1=

На этом компьютере с Ubuntu нам нужна строка:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

Ниже этой строки есть еще одна строка «PS1=», но она намного короче. Если вы прочитаете, что происходит в блоке if-then, вы увидите, что одно приглашение предназначено для цветных дисплеев, а другое — для монохромных. Если вы используете Git, вы программист. Вскоре вы сможете выяснить, с какой подсказкой вам нужно работать.

Мы добавим нашу функцию над блоком if-then. Я называю это get_git_branch.

Он содержит те же команды, которые мы использовали в командной строке. Теперь нам нужно определить, откуда вызывать функцию, в определении командной строки.

Это конец определения подсказки.

\w\[\033[00m\]\$ '

Вот как это устроено.

\w

Это токен, который заменяется рабочим каталогом при отображении командной строки.

\[\033[00m\]

Это цветовой код ASCII. Он снова устанавливает цвет текста на белый, так что знак доллара «$» в командной строке отображается белым текстом.

\$ '

При этом отображается знак доллара и пробел, а затем закрывается определение командной строки одинарной кавычкой.

Мы вызовем нашу функцию сразу после токена «\w». Мы также добавим цветовой код, чтобы текущая ветка Git отображалась желтым цветом, чтобы выделить ее. Это текст, который мы собираемся вставить.

\[\033[01;33m\]$(get_git_branch)

Обратите внимание, что в вставленном тексте нет пробелов. Вот как выглядит полная командная строка с нашими дополнениями.

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;33m\]$(get_git_branch)\[\033[00m\]\$ '

Сохраните изменения и закройте редактор. Закройте окна терминала и откройте новое окно терминала. Вы увидите обычную командную строку. Перейдите в каталог, содержащий репозиторий Git.

pwd
cd taf

Имя текущей ветки Git отображается желтым цветом. Если вы выберете другую ветку, ваша командная строка немедленно изменится.

git checkout timed-events

Это не только для Git

Вы можете использовать этот метод для отображения любой информации, которую вы можете собрать с помощью инструментов командной строки.

Например, если вы создадите эту функцию и вызовете ее из приглашения вместо вызова get_git_branch, вы увидите время в приглашении.

get_time() {
  echo " $(date +%r)"
}

Статьи по данной тематике: