Псевдонимы Git работают аналогично обычным псевдонимам в оболочке, но они специфичны для команд Git. Они позволяют создавать ярлыки для более длинных команд или создавать новые команды, недоступные по умолчанию.
Псевдонимы выполняются в той же среде оболочки, что и другие команды git, и в основном используются для упрощения общих рабочих процессов.
Простые псевдонимы вызывают одну команду Git с набором аргументов. Например, вы можете создать псевдоним для отображения статуса репозитория, запустив git status с псевдонимом s:
[alias] s = status
Затем вы можете запустить git s, чтобы просмотреть состояние репозитория. Поскольку мы настроили псевдоним в ~/.gitconfig, он доступен для всех репозиториев в системе.
Вы также можете создавать псевдонимы git, которые запускают произвольную команду оболочки. Для этого псевдоним должен начинаться с !. Это указывает git выполнить псевдоним, как если бы это не была подкоманда git. Например, если вы хотите последовательно запустить две команды git, вы можете создать псевдоним, который запускает команду оболочки:
[alias] my-alias = !git fetch && git rebase origin/master
Этот псевдоним последовательно запускает git fetch и git rebase origin/main, когда вы запускаете git my-alias.
Одним из ограничений псевдонимов git является то, что им нельзя присвоить многострочное значение. Это означает, что для более сложных псевдонимов вам придется их минимизировать.
Кроме того, в INI-файле ; символ используется для комментирования остальной части строки. Это означает, что вы не можете использовать ; в командах вашего псевдонима.
Эти два ограничения могут затруднить создание более сложных псевдонимов с использованием стандартного синтаксиса псевдонимов git, но это все равно можно сделать. Например, псевдоним, использующий if для ветвления, может выглядеть так:
[alias] branch-if = !bash -c "'!f() { if [ -z \"$1\" ]; then echo \"Usage: git branch-if\"; else git checkout -b $1; fi; }; f'"
Эти ограничения значительно усложняют создание и поддержку псевдонимов, которые содержат какую-либо форму потока управления. Вот здесь-то и приходят на помощь сценарии.
Вы можете написать сценарий Gitalias, используя любой язык программирования, который вам нравится. Если вы знакомы со сценариями bash и хотите их использовать, вы можете создать сценарий bash, который запускает нужные команды git. Правда в том, что я гораздо сильнее разбираюсь в JavaScript, поэтому буду использовать именно его.
Еще одним важным преимуществом является то, что при использовании языка сценариев ваши псевдонимы могут принимать аргументы и работать с ними гораздо гораздо проще. Git перенаправит любые аргументы, которые вы передаете в CLI, на ваш псевдоним, добавляя их в конец вашей команды. Таким образом, ваш сценарий должен иметь возможность читать их без проблем. Например, в Node JS вы можете получить доступ к аргументам, переданным в скрипт, непосредственно в файлеprocess.argv.
Основные шаги по настройке не меняются в зависимости от выбранного языка. Вам потребуется:
В последние годы имя ветки по умолчанию для новых репозиториев изменилось с главного на основное. Это означает, что когда вы клонируете новый репозиторий, ветка по умолчанию может быть основной, а не главной. Однозначного названия больше не существует, поскольку экосистема находится в переходном периоде. В целом это хорошо, но это означает, что приведенный выше псевдоним для перебазирования не будет работать во всех случаях.
Нам нужно обновить наш псевдоним, чтобы проверить, является ли ветка основной или главной, а затем перебазировать правильную ветку. Это идеальный вариант использования сценария.
#!/usr/bin/env node const { execSync } = require('child_process'); // We want to run some commands and not immediately fail if they fail function tryExec(command) { try { return { status: 0 stdout: execSync(command); } } catch (error) { return { status: error.status, stdout: error.stdout, stderr: error.stderr, } } } function getOriginRemoteName() { const { stdout, code } = tryExec("git remote", true); if (code !== 0) { throw new Error("Failed to get remote name. \n" stdout); } // If there is an upstream remote, use that, otherwise use origin return stdout.includes("upstream") ? "upstream" : "origin"; } // --verify returns code 0 if the branch exists, 1 if it does not const hasMain = tryExec('git show-ref --verify refs/heads/main').status === 0; // If main is present, we want to rebase main, otherwise rebase master const branch = hasMain ? 'main' : 'master'; const remote = getOriginRemoteName() // Updates the local branch with the latest changes from the remote execSync(`git fetch ${remote} ${branch}`, {stdio: 'inherit'}); // Rebases the current branch on top of the remote branch execSync(`git rebase ${remote}/${branch}`, {stdio: 'inherit'});
В настоящее время для запуска скрипта нам нужно запустить узел ~/gitaliases/git-rebase-main.js. Это не идеально, и это не то, что вы когда-либо привыкли делать. Мы можем упростить это, создав псевдоним git, который запускает скрипт.
[alias] rebase-main = !node ~/gitaliases/git-rebase-main.js
Теперь вы можете запустить git rebase-main, чтобы перебазировать правильную ветку, независимо от того, основная она или главная.
Другой псевдоним, который я установил на всех своих машинах, — это изменение последнего коммита. Для меня это очень распространенный рабочий процесс, и мне нравится использовать его как одну команду. Это отличный вариант использования сценария, поскольку это простая команда, которую мне хочется запускать часто.
#!/usr/bin/env node // Usage: git amend [undo] const tryExec = require('./utils/try-exec'); async function getBranchesPointingAtHead() { const { stdout, code } = await tryExec('git branch --points-at HEAD', true); if (code !== 0) { throw new Error('Failed to get branches pointing at HEAD. \n' stdout); } return stdout.split('\n').filter(Boolean); } (async () => { const branches = await getBranchesPointingAtHead(); if (branches.length !== 1) { console.log( 'Current commit is relied on by other branches, avoid amending it.' ); process.exit(1); } if (process.argv[2] === 'undo') { await tryExec('git reset --soft HEAD@{1}'); } else { await tryExec('git commit --amend --no-edit'); } })();
Этот скрипт немного сложнее предыдущего, так как в нем есть некоторый поток управления. Он проверит, полагаются ли на текущий коммит другие ветки, и если да, то завершится с ошибкой. Это сделано для того, чтобы вы не могли изменить коммит, на который полагаются другие ветки, поскольку это может вызвать проблемы при попытке объединить любую ветку, основанную на коммите.
Чтобы настроить псевдоним, вы можете использовать тот же метод, что и раньше:
[alias] amend = !node ~/gitaliases/git-amend.js
Теперь вы можете запустить git amend, чтобы изменить последнее изменение, или git amend undo, чтобы отменить последнее изменение. Это скрипт, который я изначально написал в своем gitconfig, но по мере того, как он усложнялся, я переместил его в файл сценария. Это отличный способ управлять сложностью псевдонимов. Для сравнения вот оригинальный псевдоним:
[alias] amend = !bash -c "'f() { if [ $(git branch --points-at HEAD | wc -l) != 1 ]; then echo Current commit is relied on by other branches, avoid amending it.; exit 1; fi; if [ \"$0\" = "undo" ]; then git reset --soft \"HEAD@{1}\"; else git commit --amend --no-edit; fi }; f'"
Этот скрипт также можно было бы извлечь в файл .sh, но хранение вещей в узле лично для меня снижает нагрузку на обслуживание. Раньше каждый раз, когда мне нужно было обновить этот псевдоним, мне приходилось вставлять его в линтер bash, вносить изменения, минимизировать его, а затем вставлять обратно в свой gitconfig. Это было неприятно, и из-за этого я часто избегал обновления псевдонима. Теперь, когда он находится в файле сценария, я могу обновить его, как и любой другой сценарий.
Настройка псевдонимов в виде скриптов может открыть совершенно новый уровень возможностей ваших псевдонимов git. Однако при этом следует учитывать некоторые вещи.
При настройке подобных псевдонимов важно помнить, что cwd скрипта будет текущим рабочим каталогом оболочки, в которой выполняется скрипт. Любые относительные пути к файлам в сценарии будут рассматриваться как относительные к cwd оболочки, а не к местоположению сценария. Иногда это очень полезно, а иногда очень болезненно. Однако для нашего сценария rebase-main это не проблема, и единственным признаком того, что это происходит, является то, что мы использовали ~ в пути к файлу, чтобы ссылаться на местоположение сценария как на абсолютный путь.
Внедрение сценариев в ваши псевдонимы git также может вызвать соблазн добавлять в ваши псевдонимы все больше и больше логики. Из-за этого их сложнее поддерживать и понимать, но и труднее запоминать. Не стоит использовать сверхсложный псевдоним, так как вы в любом случае с меньшей вероятностью будете его использовать. Кроме того, вы должны быть осторожны, чтобы не использовать что-либо, что может занять слишком много времени, чтобы столкнуться с вашими псевдонимами. Если вы запускаете скрипт, выполнение которого занимает много времени, возможно, вам стоит подумать, подходит ли это место для него.
Надеюсь, эта статья продемонстрировала вам возможности использования сценариев в псевдонимах git. Используя сценарии, вы можете создавать более сложные псевдонимы, которые легче поддерживать и понимать. Это может сделать ваш рабочий процесс git более эффективным и приятным. Дополнительные примеры псевдонимов git можно найти в моем проекте dotfiles. Он содержит множество настроек, которые я храню на всех своих машинах, включая псевдонимы git.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3