Решил написать небольшую заметку о том, как сделать работу с git’ом из консоли немного удобнее и приятнее.
Хочу осветить 3 небольших момента:
- Украшаем приглашение командной строки, чтобы сразу было видно в какой ветке находимся.
- Автодополнение веток и тэгов при работе в консоли.
- Настройка алиасов git.
Отображение текущей ветки в приглашении.
Не знаю, кому как, а я привык работать с git из консоли. Поэтому у меня всегда открыт шелл с директорией проекта. И порой забываешь, в какой ты сейчас ветке находишься, и надо писать git status, чтобы это увидеть. Крайне удобно было бы сразу видеть текущую ветку, да и вообще статус рабочей директории. Без проблем! Все что нужно, это немного подправить свой .bash_profile|.bashrc. Меняем приглашение шелла слендующим образом:
[11:47] cmd#:5003
kostik@KOsTIK: ~> vim .bash_profile
# Для начала определить некоторые цвета:
red='\033[0;31m'
RED='\033[1;31m'
blue='\033[0;34m'
BLUE='\033[1;34m'
cyan='\033[0;36m'
CYAN='\033[1;36m'
green='\033[0;32m'
GREEN='\033[1;32m'
yellow='\033[0;33m'
YELLOW='\033[1;33m'
purple='\033[0;35m'
PURPLE='\033[1;35m'
NC='\033[0m' # No Color (нет цвета)
## Добавим неско полезных функций
# Статус репозитория
function git_dirty_flag() {
fl=`git status 2>/dev/null | grep -c :`
if [ $fl -gt 0 ]; then
fl="\[${PURPLE}\]*"
echo $fl
fi
}
# Ветка
function parse_git_branch() {
br=`git branch --no-color 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
if [ "$br" != "" ]; then
br="\[${RED}\] {\[${CYAN}\]$br\[${RED}\]}"
echo $br
fi
}
# Настроим само приглашение. Поскольку в приглашении используются функции, нельзя просто написать
# PS1="\[${GREEN}\][\[${CYAN}\]\A\[${GREEN}\]] cmd#:\[${PURPLE}\]\!\n\[${GREEN}\]\u\[${RED}\]@\[${green}\]\h\[${GREEN}\]: \[${PURPLE}\]\w$(parse_git_branch)$(git_dirty_flag)\[${GREEN}\]>\[${NC}\] "
# Оно не будет работать.
# Но это легко поправить если использовать в качестве приглашения функцию, которая автоматически будет вызываться каждый раз для отображения приглашения, а следовательно она же будет вычисляться и все будет хорошо. Поэтому делаем так:
function powerprompt()
{
PS1="\[${GREEN}\][\[${CYAN}\]\A\[${GREEN}\]] cmd#:\[${PURPLE}\]\!\n\[${GREEN}\]\u\[${RED}\]@\[${green}\]\h\[${GREEN}\]: \[${PURPLE}\]\w$(parse_git_branch)$(git_dirty_flag)\[${GREEN}\]>\[${NC}\] "
}
# говорим, что наше приглашение - это то, что делает функция powerprompt
PROMPT_COMMAND=powerprompt
После этого надо или перезайти в консоль или просто применить новые изменения:
[11:47] cmd#:5003
kostik@KOsTIK: ~> . .bash_profile
Теперь наша консоль будет выглядеть вот так:
# Это приглашение в обычном каталоге
[11:57] cmd#:5004
kostik@KOsTIK: ~>
# Это приглашение в папке с git репозиторием с чистым деревом
[11:58] cmd#:5164
kostik@KOsTIK: ~/Projects/VISION_Admin {dev}> git status
# On branch dev
nothing to commit (working directory clean)
# Это приглашение в папке с git репозиторием, где есть незакоммитенные данные
[12:00] cmd#:5166
kostik@KOsTIK: ~/Projects/VISION_Admin {dev}*> git st
# On branch dev
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# src/1.qwe
nothing added to commit but untracked files present (use "git add" to track)
Так как Syntax Highlighter все раскрасил по своему, то вот скриншотик как это выглядит на самом деле.
Таким образом один взгляд на приглашение шелла сразу дает нам возможность понять, в какой ветке мы сейчас находимся и есть ли там какие-то неучтеные изменения.
Автодополнение веток и тэгов.
Такс, текущую ветку в шелле мы уже видим. Но ведь довольно часто приходится переключаться на другие ветки или тэги. Было бы крайне удобно, если бы шелл подсказывал названия веток так же как и имена директорий и команд. В OS X токого по умолчанию нет. Бинарные пакеты с git’ом ставят только сам git. В Убунтах, кажется, автодополнение есть сразу. Но тем не менее, всем кому это актуально, вот как это легко сделать:
# Качаем вот этот файлик с гитхаба
[12:12] cmd#:5010
kostik@KOsTIK: ~> curl https://github.com/git/git/raw/master/contrib/completion/git-completion.bash -OL
# Прописываем следующую строчку в своем bash_profile
[12:13] cmd#:5011
kostik@KOsTIK: ~> vim .bash_profile
source ~/git-completion.bash
# Перезаходим в консоль или сразу применяем изменения
[12:14] cmd#:5012
kostik@KOsTIK: ~> . .bash_profile
Все. После этого по табу у вас будут дополнятся ветки и тэги, как локальные так и удаленные.
[12:12] cmd#:5170
kostik@KOsTIK: ~/Projects/VISION_Admin {dev}> git br -a
cam-group_hardware_setting
* dev
js-refac
master
position_camgroup
processes
remotes/origin/cam-group_hardware_setting
remotes/origin/dev
remotes/origin/ext_backup_upload
remotes/origin/fix2032
remotes/origin/js-refac
remotes/origin/master
remotes/origin/position_camgroup
remotes/origin/processes
[12:17] cmd#:5171
kostik@KOsTIK: ~/Projects/VISION_Admin {dev}> git co
1.0.0a 1.1.1 cam-group_hardware_setting js-refac origin/ext_backup_upload origin/position_camgroup
1.0.10 FETCH_HEAD dev master origin/fix2032 origin/processes
1.0.7 HEAD ext_backup_upload origin/cam-group_hardware_setting origin/js-refac position_camgroup
1.1.0 ORIG_HEAD fix2032 origin/dev origin/master processes
[12:17] cmd#:5171
kostik@KOsTIK: ~/Projects/VISION_Admin {dev}> git co p
position_camgroup processes
Настройка алиасов.
Ну и последний маленький кусочек оптимизации работы с git — настройка алиасов. Программисты — вообще народ ленивый, собственно именно по этому они пишут программы, а не делают все руками 🙂 И мне вот каждый раз набирать git checkout или git commit очень длинно и лень. Благо в git есть замечательные алиасы. Добавляем в свой gitconfig алиасы на свой вкус. У меня например забиты вот такие:
[12:16] cmd#:5012
kostik@KOsTIK: ~> vim .gitconfig
[alias]
····logp = log --pretty=format:\"%h — %an: %s\"
····remotes = remote -v
····co = checkout
····st = status
····ci = commit
····br = branch
····logpg = log --pretty=format:\"%h — %an: %s\" --graph
····logg = log --graph
hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short
После этого достаточно написать в консоли git logpg и гит превратит это в git log —pretty=format:\»%h — %an: %s\» —graph
Ну вот и все. Если кому интересно, вот мой bash_profile на гитхабе.