Настройка bash completion для git под Mac OS

В последнее время я часто использую git для разных проектов и хочу поделиться несколькими советами, как сделать работу с ним удобнее.

Одним из преимуществ git являются дешевые бранчи. Поскольку бранч -это просто файл в .git/refs/heads, который содержит id последнего коммита в этом бранче, создание нового бранча выполняется за очень небольшое время. При таких возможностях разумно использовать бранчи, что называется, “на все деньги”, что большинство программистов и делает.

Независимо от выбранной модели использования бранчей, рано или поздно наступает момент, когда можно забыть, в каком бранче вы находитесь в данный момент и закоммитить код не туда. Хотя это некритично и ошибку можно легко исправить, но таких ситуаций по возможности хотелось бы избегать. К счастью, информацию о имени бранча и прочие сведения довольно легко добавить в bash prompt, которая постоянно перед глазами.

Установка git bash completion

В состав git включены несколько полезных скриптов, среди которых git-completion.bash. После его подключения в списке completion для bash добавляются команды git, имена локальных и remote брачей, теги и многое другое. Кроме этого, скрипт определяет несколько полезных функций, которые можно использовать для получения информации об окружении.

% git <tab><tab>
add           -- add file contents to index
am            -- apply patches from a mailbox
apply              -- apply patch to files and/or to index
archimport         -- import an Arch repository into git
archive       -- create archive of files from named tree
bisect        -- find, by binary search, change that introduced a bug
blame              -- show what revision and author last modified each line of a file
br       -- alias for 'branch'
branch        -- list, create, or delete branches
bundle        -- move objects and refs by archive
cat-file           -- provide content or type information for repository objects
check-attr          -- display gitattributes information
check-ref-format    -- ensure that a reference name is well formed
checkout      -- checkout branch or paths to working tree
checkout-index     -- copy files from index to working directory
cherry             -- find commits not merged upstream

Если вы пользуетесь MacPorts, убедитесь, что git-core установлен с вариантом +bash_completion

% sudo port install git-core +bash_completion
---> Computing dependencies for git-core
---> Cleaning git-core

Если вы установили git из исходников, поищите - скрипт должен лежать где-то в системе.

% mdfind git-completion
/usr/local/Cellar/git/1.8.2/etc/bash_completion.d/git-completion.bash

Настройка bash prompt

Добавьте следующие строчки в ~/.bashrc

source /path/to/git-completion.bash

function __set_prompt
{
	# Configure Colors:
	WHITE='033[1;37m'
	LIGHTGRAY='033[0;37m'
	GRAY='033[1;30m'
	BLACK='033[0;30m'
	RED='033[0;31m'
	LIGHTRED='033[1;31m'
	GREEN='033[0;32m'
	LIGHTGREEN='033[1;32m'
	BROWN='033[0;33m'
	YELLOW='033[1;33m'
	BLUE='033[0;34m'
	LIGHTBLUE='033[1;34m'
	PURPLE='033[0;35m'
	PINK='033[1;35m'
	CYAN='033[0;36m'
	LIGHTCYAN='033[1;36m'
	DEFAULT='033[0m'

	export PS1="[${GREEN}]u.h[${LIGHTBLUE}]"' $(__git_ps1 "(%s) ")'"[${BROWN}]w [${DEFAULT}]$ "
} 
__set_prompt

Update: цвета в PS1 нужно заключать в [], иначе bash будет некорректно рассчитывать длину приглашения и в терминале перевод строки будет обрабатываться некорректно.

После настройки, если текущий каталог находится под контролем git, в командной строке будет отображаться имя текущего бранча.

comments powered by Disqus