Создание собственных команд в Git

Всем привет! Этот материал предназначен для тех, кто уже имеет начальный уровень работы с GIT и BitBucket. Рассмотрю примеры в Git Bash version 2.33.0, API BitBucket 2.0, https://bitbucket.org

  • Что такое alias (знакомство)
  • Создание alias с выполнением функции
  • Alias с переменной
  • Alias для создания удаленного репозитория BitBucket в Git Bash

1. Что такое alias (знакомство)

В Git имеется возможность добавления собственных команд, которые значительно расширяют возможности Git-а, как инструмента. Вы можете создавать собственные команды и научить GIT выполнять их. А также делать существующие длинные команды GIT-а более короткими, что значительно сократить время вашей работы с GIT-ом. Я не буду описывать все команды, которые можно создавать в GIT, а расскажу только самые полезные и интересные.

Итак, начнем!

Самые частые команды, которые мы используем – это:

$ git add . $ git commit -m "message"

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

Новые команды можно создавать с помощью встроенной команды GIT-а: alias.

Давайте создадим нашу первую команду. Введите в Git Bash:

$ git config --global --add alias.ac '!git add -A && git commit -m'

В этом примере мы создали команду ac, которая объединяет команды GIT: add . и commit -m.

Знак {!} – оповещает, что будет команда оболочки.

Параметр --global указывает, что изменения вносятся в глобальный конфигурационный файл GIT — а (т.е. корневой каталог, куда установлен GIT), а не репозитория.

Параметр --add, как не сложно догадаться, добавляет новый алиас. Если вы хотите удалить алиас, то следует заменить --add на --unset. Если хотите перезаписать алиас, то тогда нужно поставить --replace-all.

$ cd c:/workspace/first_repo

Теперь попробуем выполнить новую команду в Git Bash:

$ git ac

Результат:

[master 04851cd] test new alias ac 1 file changed, 1 insertion(+) create mode 100644 11.txt

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

Перепишем алиас ac:

$ git config --global --replace-all alias.ac '!git add -A && git commit -m && git status'

Если выполнить команду ac в таком варианта, то git Bash выдаст ошибку:

error: pathspec ‘arg’ did not match any file(s) known to git

Потому что после команды commit -m ожидается комментарий:

$ git commit -m "какой-то комментарий"

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

$ git config --global --replace-all alias.ac '!git add -A && git commit -m "$1" && git status'

Теперь выполним команду ac в Git Bash:

$ git ac "test arg"

Результат:

[master 7949a4d] test arg 1 file changed, 1 insertion(+), 1 deletion(-) On branch master Your branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean

Все работает верно! Наш комментарий «test arg» передался в переменную $1 и выполнил последовательно команды Git-а.

Ну вот теперь, когда мы познакомились с alias, можно попробовать что-то посложнее.

2. Создание alias с выполнением функции

Создадим функцию с bash-командами и обернем ее командой GIT-а. Т.е. при выполнении команды GIT-а, выполнится функция с bash командами. Создайте в директории с установленным Git-ом файл ~\Git\etc\.my_functions и пропишите там функцию fn:

fn() { echo "Hello, world!" }

Затем откройте git bash и командой добавьте alias, который назовем echofn:

$ git config --global --add alias.echofn $'!bash -c \'source /etc/.my_functions && fn\''

Алиас echofn будет запускать bash, а bash -с, в свою очередь, выполнит строку в одинарных кавычках. В строке команда source прочитает файл .my_functions и выполнит функцию fn. Обратите внимание, что внутренние одинарные кавычки должны быть экранированы (\’), т.к. они находятся внутри одинарных кавычек. Впереди с описанием команды необходимо поставить знак $, чтобы правильно передать всю строку с bash командами и не возникало ошибки: bash: syntax error near unexpected token `}’

Теперь, если выполним нашу новую команду в Git Bash:

$ git echofn

, то получим результат:

Hello, world!

3. Alias с переменной

Есть еще способ создания алиаса. Можно команды-алиасы прописывать прямо в файлах Git-а. Пропишите в файле ~\Git\etc\gitconfig строки:

[alias] hw = "!f(){ echo \"Hello World!!\"; echo \"My name is $1. And I'm developer\"; };f "

Затем запустите новую команду {hw} в Git Bash:

$ git hw "Olga"

Результат:

Hello World!! My name is Olga. And I'm developer

Чтобы посмотреть все наши созданные алиасы, выполните команду в Git Bash, чтобы прочитать строки с помощью регулярного выражения, начинающиеся со слова «alias» из конфигурационных настроек Git-а:

$ git config --get-regexp '^alias\.'

А еще лучше создайте новую команду Git-a. Выполните команду в Git Bash:

$ git config --global alias.aliases "config --get-regexp '^alias\.'"

(а затем выполните созданную команду в Git Bash):

$ git aliases

Результат покажет все ваши алиасы:

alias.hw !f(){ echo "Hello World!!"; echo "My name is $1. And I'm developer"; };f alias.echofn !bash -c 'source /etc/.my_functions && fn' alias.ac !git add -A && git commit -m "$1" && git status alias.aliases config --get-regexp '^alias\.'

4. Alias для создания удаленного репозитория BitBucket в Git Bash

Самое полезное я оставила на конец. Если вы используете в качестве удаленного репозитория BitBucket, то наверняка сталкивались с такой проблемой – как создать новый репозиторий из консоли. Например: вы создали новый репозиторий на локальной машине, делали в нем изменения файлов. И вот когда закончили и решили запушить это на BitBucket, то вам выдается ошибка, что на BB репозитория нет и его надо сначала создать. Вы идете на сайт BitBucket-а, создаете там пустой репозиторий, потом из консоли Git Bash делаете связку с удаленным репозиторием. Не слишком изящно, да? Если у вас нет возможности установить дополнительные инструменты, то тут как раз подойдет создание новой команды.

На площадке BitBucket есть API, который позволяет исполнять команды для различных действий. Документацию по API команд вы можете посмотреть тут: https://developer.atlassian.com/cloud/bitbucket/rest/intro/#authentication

Цепочка команд формируется в виде форматированного контента в формате JSON. А далее необходимо этот форматированный контент послать на ресурс API BitBucket. Послать можно с помощью библиотеки CURL, которая поставляется вместе с пакетом Git Bash.

Пропишите в файле ~\Git\etc\.my_functions строки:

namerep="$1"
new_repo() { curl -X POST -u "{login_id}:{app_password}" -H "Content-Type: application/json" \ https://api.bitbucket.org/2.0/repositories/iammultic/"$namerep" \ -d '{ "scm": "git", "is_private": true, "project": {"key": "MAIN"}}' }

Итак, мы создали функцию new_repo, которая будет создавать с помощью Curl и API BitBucket 2.0.

удаленный репозиторий. Вместо {login_id} – вы прописываете свой логин, зарегистрированный в BitBucket; вместо {app_password} – прописываете APP пароль, который можно сгенерировать в BitBucket-е нажав на свой профиль-> Personal settings-> App Paswords-> Create app password. Откроется диалоговое окно:

Создание собственных команд в Git

Затем выбираете необходимые параметры и жмете Create.

Далее вы увидите пароль – строку:

Создание собственных команд в Git

Запишите свой пароль. Этот пароль вы можете использовать для аутентификации в различных приложениях. Например: графических редакторах версионного контроля и т.д.

Вернемся к нашей функции new_repo… Обратите внимание на строку перед функцией namerep= «$1». «$1» – это параметр, который будет передаваться из GIT, а namerep – это глобальная bash переменная, которая потом будет использована внутри функции. Эта переменная будет принимать наименование нашего нового репозитория.

Теперь, в файле ~\Git\etc\gitconfig пропишите строки и сохранитесь:

[alias] cr = "! bash -c 'source /etc/.my_functions && new_repo ' $1"

Далее, выполните новую команду в Git Bash:

$ git cr repo1

Если вы посмотрите в своем аккаунте список репозиторий в BB, то увидите там новый репозиторий repo1

Создание собственных команд в Git

Удаленный репозиторий мы создали, но нам надо также его создать на локальной машине и связать его с удаленным. Здесь можно выбрать — каким способом вы хотите сделать связь между удаленным и локальным репозиторием. Можно сделать клон:

1 вариант

$ cd c:/workplace $ clone git@bitbucket.org:iammultic/repo1.git

, либо создать такую директорию в вашей рабочей области на локальной машине и связать репозитории:

2 вариант

$ cd c:/workplace $ mkdir repo1 $ cd c:/workplace/repo1 $ git remote add origin git@bitbucket.org:iammultic/repo1.git

Я выбираю первый вариант.

Добавьте пару строк в ранее созданную функцию (~\Git\etc\.my_functions):

namerep="$1"
new_repo() { curl -X POST -u "iammultic:********************" -H "Content-Type: application/json" \ https://api.bitbucket.org/2.0/repositories/iammultic/$namerep \ -d '{ "scm": "git", "is_private": true, "project": {"key": "MAIN"}}' ; cd /c/workspace ; git clone git@bitbucket.org:iammultic/$namerep.git }

Выполните в Git Bash команду:

$ git cr repo2

Все готово!!!

Проверьте создание нового репозитория в Bitbucket и создание локального репозитория в вашей рабочей директории на локальной машине.

Все примеры работающие, проверенные – можно использовать в работе с Git и BitBucket. И вы можете создать больше полезных для себя alias-ов и применять их, чтобы не тратить много времени на ведение и контроль версии файлов.

77
1 комментарий

Привет, снова, Хабр!