Мои псевдонимы в Git

Перевод статьи My git aliases, автор - Kamal Marhubi

У меня есть несколько алиасов (псевдонимов) в моем .gitconfig, которые я считаю полезными в своей работе. Так что я охотно поделюсь ими с вами.

git root: вывести полный путь к корневой директории хранилища

# Print absolute path of repo root directory
root = rev-parse --show-toplevel

Это полезно для использования в шелле, если вы переходите через команду cd куда-либо глубже в хранилище, но хотите применить команду в корневом каталоге, например, для переименования:

somewhere/in/repo$ sed -i 's/oldname/newname/g' $(git root)/**

git detach: переход в состояние отделенного HEAD

# Get to a detached HEAD state on purpose! Usage: `git detach [REF]`
detach = !sh -c 'git checkout $(git rev-parse ${1:-HEAD})' --

Обычно отдельно стоящий HEAD не требуется, но я хотел в некоторых случаях использовать его в качестве псевдонима. Например, иногда я хочу экспериментировать, не создавая ветку. Запуск git detach создает "ветвь", и я могу вносить изменения, но без необходимости называть ее или удалять впоследствии. Если нужно сохранить работу, я всегда могу использовать команды git checkout -b new-branch-name или git checkout old-branch-name && git merge --ff-only HEAD@{1}.

Этот псевдоним использует расширение оболочки, вызывая sh -c. Запускается команда оболочки, а затем sh -c запускает все остальное через sh. Окончательный -- необходим для отправки дополнительных аргументов, чтобы перейти к git checkout, а не sh.

git sha1: печать короткого SHA1 для коммита

# Print short sha1; usage: `git sha1 [REF]`
sha1 = !sh -c 'git rev-parse --short ${1:-HEAD}' --

Чаще всего используется с xsel или pbcopy, как git sha1 | xsel -i, чтобы скопировать текущий коммит sha1 в буфер обмена.

Я использую sh -c снова для расширения оболочки, хотя здесь это просто для подачи реф по умолчанию.

git gh-url: получить ссылку GitHub для репозитория

# Get the GitHub URL for a GitHub repository. Usage: `git gh-url [REMOTE]`
gh-url = "!f() { \
	if ! remote=${1:-$(git config --get \
		branch.$(git symbolic-ref --short HEAD).remote)}; \
	then \
		echo no remote specified and could not get remote for HEAD; \
		exit; \
	fi; \
	if ! remote_url=$(git config --get remote.$remote.url); \
	then \
		echo "could not get URL for remote \\`$remote\\`"; \
		exit; \
	fi; \
	case $remote_url in \
		git@github.com:*.git) \
			repo=$(echo $remote_url \
				| sed 's/git@github.com:\\(.*\\).git/\\1/');; \
		https://github.com/*) \
			repo=$(echo $remote_url \
				| sed 's+https://github.com/\\(.*\\).git+\\1+');; \
		*) \
			echo "\\`$remote\\` does not appear to have " \
				"a GitHub remote url: $remote_url"; \
			exit 1;; \
	esac; \
	echo https://github.com/$repo; \
}; \
f"

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

my-alias = "!f() { \
	echo COMMANDS GO HERE, ESCAPING NEWLINES WITH \
		BACKSLASHES, AND TERMINATING WITH SEMICOLONS; \
}; \
f"

Поскольку мы в строке внутри файла конфигурации, есть досадное количество необходимостей, но вы можете сделать это довольно быстро.