「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > スクリプトを使用した超強力な Git エイリアス

スクリプトを使用した超強力な Git エイリアス

2024 年 11 月 8 日に公開
ブラウズ:379

Superpowered Git Aliases using Scripting

Git エイリアスとは

Git エイリアスはシェル内の通常のエイリアスと同様に機能しますが、Git コマンドに固有のものです。これらを使用すると、長いコマンドのショートカットを作成したり、デフォルトでは使用できない新しいコマンドを作成したりできます。

エイリアスは他の git コマンドと同じシェル環境で実行され、主に一般的なワークフローを簡素化するために使用されます。

単純なエイリアス

単純なエイリアスは、一連の引数を指定して単一の Git コマンドを呼び出します。たとえば、s alias:
を指定して git status を実行することで、リポジトリのステータスを表示するエイリアスを作成できます。

[alias]
  s = status

その後、 git s を実行してリポジトリのステータスを表示できます。 ~/.gitconfig でエイリアスを構成したため、システム上のすべてのリポジトリで使用できます。

より複雑なエイリアス

任意のシェル コマンドを実行する git エイリアスを作成することもできます。そのためには、エイリアスが ! で始まる必要があります。これにより、git に対して、エイリアスを git サブコマンドではないかのように実行するように指示されます。たとえば、2 つの git コマンドを順番に実行したい場合は、シェル コマンドを実行するエイリアスを作成できます:

[alias]
  my-alias = !git fetch && git rebase origin/master

このエイリアスは、git my-alias を実行すると、git fetch と git rebaseorigin/main を順番に実行します。

git エイリアスの制限の 1 つは、複数行の値を設定できないことです。これは、より複雑なエイリアスについては、それらを縮小する必要があることを意味します。

さらに、INI ファイルでは ;文字は行の残りの部分をコメントアウトするために使用されます。これは、 ; を使用できないことを意味します。エイリアス コマンド内。

これら 2 つの制限により、標準の 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 スクリプトに精通しており、使用したい場合は、目的の git コマンドを実行する bash スクリプトを作成できます。実のところ、私は JavaScript の方がはるかに得意なので、それを使用するつもりです。

もう 1 つの大きな利点は、スクリプト言語を使用することで、エイリアスが引数を はるかに簡単に受け取って操作できることです。 Git は、CLI で渡された引数をコマンドの末尾に追加してエイリアスに転送します。したがって、スクリプトは問題なくそれらを読み取ることができるはずです。たとえば、Node JS では、process.argv.

でスクリプトに渡された引数に直接アクセスできます。

これを設定する基本的な手順は、選択した言語によって変わりません。次のことを行う必要があります:

  • 必要な git コマンドを実行するスクリプトを作成します
  • スクリプトを実行するエイリアスを作成します

ケーススタディ: メイン/マスターのリベース

近年、新しいリポジトリのデフォルトのブランチ名がマスターからメインに変更されました。これは、新しいリポジトリのクローンを作成する場合、デフォルトのブランチがマスターではなくメインになる可能性があることを意味します。エコシステムが過渡期にあるため、非常に一貫した名前はもうありません。これは全体的には良いことですが、リベースするための上記のエイリアスがすべての場合に機能するとは限らないことを意味します。

エイリアスを更新してブランチがメインかマスターかを確認し、正しいブランチをリベースする必要があります。これはスクリプトの完璧な使用例です。

#!/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'});

現在、スクリプトを実行するには、node ~/gitaliases/git-rebase-main.js を実行する必要があります。これは理想的ではありませんし、習慣的に行うこともできません。スクリプトを実行する git エイリアスを作成することで、これを簡単に行うことができます。

[alias]
  rebase-main = !node ~/gitaliases/git-rebase-main.js

これで、メインかマスターかに関係なく、 git rebase-main を実行して正しいブランチをリベースできるようになりました。

ケーススタディ: 修正

すべてのマシンに設定したもう 1 つのエイリアスは、最後のコミットを修正することです。これは私にとって非常に一般的なワークフローであり、単一のコマンドとして使用することを好みます。これは、頻繁に実行したい単純なコマンドであるため、スクリプトの優れた使用例です。

#!/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 エイリアスを含む、すべてのマシン上で保持している多くの設定が含まれています。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/agentender/superpowered-git-aliases-using-scripting-4odf?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3