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

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

  • Что та…
7
!bash -c \\'source /etc/.my_functions && fn\\''","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EАлиас echofn будет запускать bash, а bash -с, в свою очередь, выполнит строку в одинарных кавычках. В строке команда source прочитает файл .my_functions и выполнит функцию fn. Обратите внимание, что внутренние одинарные кавычки должны быть экранированы (\\’), т.к. они находятся внутри одинарных кавычек. Впереди с описанием команды необходимо поставить знак $, чтобы правильно передать всю строку с bash командами и не возникало ошибки: bash: syntax error near unexpected token `}’\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТеперь, если выполним нашу новую команду в Git Bash:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$ git echofn","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E, то получим результат:\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EHello, world!\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003E3. Alias с переменной\u003C/b\u003E\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсть еще способ создания алиаса. Можно команды-алиасы прописывать прямо в файлах Git-а. Пропишите в файле ~\\Git\\etc\\gitconfig строки:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"[alias]\n\thw = \"!f(){ echo \\\"Hello World!!\\\"; echo \\\"My name is $1. And I'm developer\\\"; };f \"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЗатем запустите новую команду {hw} в Git Bash:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$ git hw \"Olga\"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРезультат:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"Hello World!!\nMy name is Olga. And I'm developer","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЧтобы посмотреть все наши созданные алиасы, выполните команду в Git Bash, чтобы прочитать строки с помощью регулярного выражения, начинающиеся со слова «alias» из конфигурационных настроек Git-а:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$ git config --get-regexp '^alias\\.'","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EА еще лучше создайте новую команду Git-a. Выполните команду в Git Bash:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$ git config --global alias.aliases \"config --get-regexp '^alias\\.'\"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E(а затем выполните созданную команду в Git Bash):\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$ git aliases","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРезультат покажет все ваши алиасы:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"alias.hw !f(){ echo \"Hello World!!\"; echo \"My name is $1. And I'm developer\"; };f\nalias.echofn !bash -c 'source /etc/.my_functions && fn'\nalias.ac !git add -A && git commit -m \"$1\" && git status\nalias.aliases config --get-regexp '^alias\\.'","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003E4. Alias для создания удаленного репозитория BitBucket в Git Bash\u003C/b\u003E\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EСамое полезное я оставила на конец. Если вы используете в качестве удаленного репозитория BitBucket, то наверняка сталкивались с такой проблемой – как создать новый репозиторий из консоли. Например: вы создали новый репозиторий на локальной машине, делали в нем изменения файлов. И вот когда закончили и решили запушить это на BitBucket, то вам выдается ошибка, что на BB репозитория нет и его надо сначала создать. Вы идете на сайт BitBucket-а, создаете там пустой репозиторий, потом из консоли Git Bash делаете связку с удаленным репозиторием. Не слишком изящно, да? Если у вас нет возможности установить дополнительные инструменты, то тут как раз подойдет создание новой команды.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНа площадке BitBucket есть API, который позволяет исполнять команды для различных действий. Документацию по API команд вы можете посмотреть тут: \u003Ca href=\"https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fdeveloper.atlassian.com%2Fcloud%2Fbitbucket%2Frest%2Fintro%2F%23authentication&postId=413224\" rel=\"nofollow noreferrer noopener\" target=\"_blank\"\u003Ehttps://developer.atlassian.com/cloud/bitbucket/rest/intro/#authentication\u003C/a\u003E\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЦепочка команд формируется в виде форматированного контента в формате JSON. А далее необходимо этот форматированный контент послать на ресурс API BitBucket. Послать можно с помощью библиотеки CURL, которая поставляется вместе с пакетом Git Bash.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПропишите в файле ~\\Git\\etc\\.my_functions строки:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"namerep=\"$1\"","lang":""}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"new_repo() {\ncurl -X POST -u \"{login_id}:{app_password}\" -H \"Content-Type: application/json\" \\\nhttps://api.bitbucket.org/2.0/repositories/iammultic/\"$namerep\" \\\n-d '{ \"scm\": \"git\", \"is_private\": true, \"project\": {\"key\": \"MAIN\"}}'\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EИтак, мы создали функцию new_repo, которая будет создавать с помощью Curl и API BitBucket 2.0.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003Eудаленный репозиторий. Вместо {login_id} – вы прописываете свой логин, зарегистрированный в BitBucket; вместо {app_password} – прописываете APP пароль, который можно сгенерировать в BitBucket-е нажав на свой профиль-> Personal settings-> App Paswords-> Create app password. Откроется диалоговое окно:\u003C/p\u003E"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"a19960cf-d573-56dd-a405-7a2b30f8739c","width":661,"height":583,"size":54581,"type":"png","color":"e6e8e9","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЗатем выбираете необходимые параметры и жмете Create.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДалее вы увидите пароль – строку:\u003C/p\u003E"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"f5b674e0-85b6-53be-adcf-e2c0da48f934","width":622,"height":434,"size":58375,"type":"png","color":"f0f1f2","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЗапишите свой пароль. Этот пароль вы можете использовать для аутентификации в различных приложениях. Например: графических редакторах версионного контроля и т.д.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВернемся к нашей функции new_repo… Обратите внимание на строку перед функцией namerep= «$1». «$1» – это параметр, который будет передаваться из GIT, а namerep – это глобальная bash переменная, которая потом будет использована внутри функции. Эта переменная будет принимать наименование нашего нового репозитория.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТеперь, в файле ~\\Git\\etc\\gitconfig пропишите строки и сохранитесь:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"[alias]\n cr = \"! bash -c 'source /etc/.my_functions && new_repo ' $1\"","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДалее, выполните новую команду в Git Bash:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$ git cr repo1","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли вы посмотрите в своем аккаунте список репозиторий в BB, то увидите там новый репозиторий repo1\u003C/p\u003E"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"a5127e20-c386-5f9f-b065-29f597e23a60","width":974,"height":430,"size":64905,"type":"png","color":"f0f1f2","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EУдаленный репозиторий мы создали, но нам надо также его создать на локальной машине и связать его с удаленным. Здесь можно выбрать — каким способом вы хотите сделать связь между удаленным и локальным репозиторием. Можно сделать клон:\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003E1 вариант\u003C/b\u003E\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$ cd c:/workplace \n$ clone git@bitbucket.org:iammultic/repo1.git","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E, либо создать такую директорию в вашей рабочей области на локальной машине и связать репозитории:\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003E2 вариант\u003C/b\u003E\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$ cd c:/workplace \n$ mkdir repo1\n$ cd c:/workplace/repo1\n$ git remote add origin git@bitbucket.org:iammultic/repo1.git","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЯ выбираю первый вариант.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДобавьте пару строк в ранее созданную функцию (~\\Git\\etc\\.my_functions):\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"namerep=\"$1\"","lang":""}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"new_repo() {\ncurl -X POST -u \"iammultic:********************\" -H \"Content-Type: application/json\" \\\nhttps://api.bitbucket.org/2.0/repositories/iammultic/$namerep \\\n-d '{ \"scm\": \"git\", \"is_private\": true, \"project\": {\"key\": \"MAIN\"}}' ;\ncd /c/workspace ;\ngit clone git@bitbucket.org:iammultic/$namerep.git\n}","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВыполните в Git Bash команду:\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"$ git cr repo2","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВсе готово!!!\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПроверьте создание нового репозитория в Bitbucket и создание локального репозитория в вашей рабочей директории на локальной машине.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВсе примеры работающие, проверенные – можно использовать в работе с Git и BitBucket. И вы можете создать больше полезных для себя alias-ов и применять их, чтобы не тратить много времени на ведение и контроль версии файлов. \u003C/p\u003E"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":1,"favorites":10,"reposts":0,"views":16,"hits":1600,"reads":null,"online":0},"dateFavorite":0,"hitsCount":1600,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id447345/413224-sozdanie-sobstvennyh-komand-v-git","author":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1768322317,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1768322317,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[{"id":1,"count":7}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}}],"ogTitle":null,"ogDescription":null,"isAnonymized":true}};