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

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

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

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

  4. 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.

Зайдите в какой-нибудь локальный репозиторий (Git Bash):

$ 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 команд вы можете посмотреть тут.

Цепочка команд формируется в виде форматированного контента в формате 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. Откроется диалоговое окно:

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

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

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

Вернемся к нашей функции 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

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

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-ов и применять их, чтобы не тратить много времени на ведение и контроль версии файлов.  

Комментарии (11)


  1. sergey-kuznetsov
    05.05.2022 07:53

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

    А в остальном спасибо за хорошую статью!


  1. sergey-kuznetsov
    05.05.2022 09:13
    -1

    Параметр --global указывает на то, что изменения вносятся в конфигурационный файл Git, находящийся в домашнем каталоге пользователя, а не в репозитории. Слово global вводит в заблуждение, на самом деле для правки конфига, который глобален для всего компьютера, используется параметр --system.

    И непонятно, почему у вас Git установлен ~, это странная конфигурация.


    1. NewTechAudit Автор
      06.05.2022 09:59

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

      Вероятно вы всегда работали с Unix. Поэтому  у вас и возник такой вопрос. Я пишу относительный путь директории в который установлен Git. Например: Git может быть установлен в C:\ProgramData\Git\, а репозитории лежать в C:\Users\*****\workspace. А может быть так: в C:\Git\, а репозитории лежать в C:\workspace. Как организовать файловую структуру - дело сугубо личное.


      1. sergey-kuznetsov
        06.05.2022 11:24

        Ах вот оно что. Вы тильдой обозначили папку установки Git.

        Но неточность в статье всё равно лучше поправить.

        В папке гита хранится системный конфиг, а не глобальный.

        Глобальный лежит в папке профиля пользователя.

        Локальный в папке репозитория.


  1. IkaR49
    05.05.2022 09:34
    +1

    При всей моей любви к консоли, я не понимаю, как можно постоянно использовать git в консольном режиме. Есть куча вариантов GUI для него, многие из которых встроены в IDE. Под виндой старый добрый TortoiseGit до сих пор, имхо, самое лучшее решение.

    Да, через GUI можно сделать не всё, но в таком случае я спускаюсь в консоль, где это всё возможно.

    По сабжу: не знал, что алиасом можно дёргать команды оболочки, если честно, так что спасибо, что-то новое подчерпнул)


    1. vanyas
      05.05.2022 10:12
      +1

      Да вот в консоли часто удобнее. Из gui vscode, я к примеру, делаю только add/commit/push, все остальное привычнее с консоли.

      Автор в статья еще явно путает bash и git, не понимая, кто из них обрабатывает команду или выдает ошибку


      1. iammultic
        05.05.2022 13:12
        +1

        А в каком месте путает? Есть гит, есть гит баш консоль, есть оболочка баш.. вроде все разделено и расписано.


        1. vanyas
          05.05.2022 13:25

          Что такое "гит баш консоль"? Есть гит и есть баш, из которого можно запустить команду гит, а можно и из любого другого шелла.


          1. iammultic
            05.05.2022 14:14

            Git bash https://www.atlassian.com/git/tutorials/git-bash удобная програмулька, попробуйте ;)


            1. vanyas
              05.05.2022 14:15

              Да меня как-то и нативный баш и гит устраивают, без всяких утилиток. А под винду тоже не понятно зачем оно, если есть WSL


              1. iammultic
                05.05.2022 14:29
                +1

                Это замечательно, когда вы можете выбирать, что установить на свою машину. У меня такого выбора нет. Вернее есть - из корпоративного списка по заявке возможно устанят :).