mcpField
G
glab-stack

glab-stack

github.com/vince-winkintel開発49105 回インストール1 日前に更新
リポジトリ

glab-stack について

glab-stack は、依存関係のある Git ブランチとコミットを GitLab のマージリクエストスタックとして管理する、実験的な glab コマンドラインスキルです。リビジョン範囲から階層を推定し、順序変更やブランチとマージリクエストの同期を行えます。

主な機能

  1. 01スタックの作成と選択
  2. 02Git リビジョンから階層を推定
  3. 03スタック変更の保存と修正
  4. 04階層の並べ替えとリベース
  5. 05ブランチとマージリクエストの同期

活用シーン

  1. 01機能を依存関係のあるマージリクエストに分割
  2. 02リビジョン範囲からスタックにコミットを追加
  3. 03並べ替え後のマージリクエストをリベースして宛先変更
  4. 04スタックの変更をプッシュしてマージリクエストを更新

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/vince-winkintel/gitlab-cli-skills --skill glab-stack

インストール後、Claude Code で/glab-stackを入力して読み込まれたか確認します。

同梱ファイルreferences/commands.md

詳細

glab stack

ワークツリーごとの選択

現在選択されているスタックは、Git ワークツリーごとに記録されます。操作するワークツリーで目的のスタックを選択し、内容を確認してください。あるワークツリーでスタックを切り替えても、別のワークツリーではそのスタックは選択されません。スタックデータとリポジトリの参照は引き続き共有される場合があるため、破壊的な操作や公開操作の確認は必要です。

概要

スタックとは、1 つの機能を実装する、小さく相互に依存した一連のマージリクエストです。ローカルでは、各差分はそれぞれ独自のブランチ上にある 1 つのコミットで、直前の差分のブランチを基点とします。同期すると、最初の差分はベースブランチを対象とし、それ以降の差分は直前のブランチを対象とする MR が作成されます。

スタックコマンドは、現在チェックアウトされているブランチに関係なく、最後に作成または切り替えたスタックを対象にします。変更を加える前に、アクティブなスタックを確認してください。この機能は現在も実験段階です。親コマンドとサブコマンドのヘルプ全文(現行の用語と例を含む、チェックサムで検証済み)については、references/commands.md を参照してください。

クイックスタート

glab stack --help

現在の動作

生成されるスタックブランチ名は {branch_prefix}-{stack-title}-{hash} です。branch_prefix が設定されていない場合、glab は OS アカウントのユーザー名を使用し(Windows のドメインプレフィックスは削除します)、ユーザー情報を取得できない場合に限り glab-stack にフォールバックします。$USER には依存しません。自動化で安定した明示的なプレフィックスが必要な場合は、glab config set branch_prefix <value> を設定してください。

glab stack infer <revision-range> は、Git のリビジョン範囲から選択したコミットを使って、スタックのレイヤーを作成または追加します。範囲の開始点は、HEAD~5 のような相対参照ではなく、ブランチ名として解決される必要があります。これは、ベースブランチがスタックのメタデータに記録されるためです。

# Infer stack layers from commits between main and the current branch
glab stack infer main..HEAD

# Infer from a feature branch that diverged from develop
glab stack infer develop..HEAD

# If no stack is active, create one with a specific name
glab stack infer --name feature-stack main..HEAD

スタックがアクティブな場合、infer はそのスタックに追加し、--name は無視します。アクティブなスタックを先に確認してください。関係のない作業を推定する場合は、glab stack create または glab stack switch を使って、先に別の追加先を選択してください。

glab stack sync は、--update-base、--assignee、--label、--reviewer、--skip-mr-creation、--skip-push をサポートします。

# Sync stack and rebase onto the latest base branch
glab stack sync --update-base

# Sync/push existing stack work without opening MRs for branches that do not have one yet
glab stack sync --skip-mr-creation

# Fetch and rebase the stack locally without pushing branches or creating MRs
glab stack sync --skip-push

# Sync stack and set MR metadata during submission
glab stack sync --assignee @owner --reviewer @reviewer --label backend

# Multiple reviewers can be repeated or comma-separated
glab stack sync --reviewer user1 --reviewer user2
glab stack sync --reviewer user1,user2

ベースブランチ(たとえば main)が更新され、プッシュ前にスタック全体をリベースしたい場合は、--update-base を使用してください。

スタックブランチの更新分をプッシュし、マージ済みのエントリを整理する一方で、まだマージリクエストがないスタックレイヤーについては新しいマージリクエストを意図的に作成しない場合は、--skip-mr-creation を使用してください。マージリクエストがクローズされた差分は、スタックに残ります。

ブランチをプッシュしたりマージリクエストを作成したりせずに、スタックをローカルで取得してリベースする場合は、--skip-push を使用してください。これはオフラインモードではありません。glab は引き続きリモートから取得し、GitLab API を呼び出します。後でプッシュする前に、書き換えられたローカル履歴を確認してください。

スタックのマージリクエストに担当者と振り分け用のメタデータを同じ手順で設定して送信する場合は、--assignee、--reviewer、--label を使用してください。

スタックの同期中にプッシュを行う際、glab は Git フックの出力を実行中に stdout/stderr へストリーミングします。自動化のログにはこの出力を残してください。失敗した pre-push フックは、バッファーに保持された出力に隠されることなく、プッシュエラーとして返されます。

glab stack switch は、スタック名を指定せずに実行すると、すべてのスタックから対話形式で選択できるようになりました。非対話型の自動化では、スタック名を指定してください。

glab stack amend は --reword をサポートしており、ファイルをステージングせずに、スタック内のコミットメッセージだけを更新できます。ファイル引数または --all とは併用できません。-m/--message または -d/--description を渡すか、glab でエディターを開いてください。

glab stack amend --reword -m "updated commit message"

glab stack amend と glab stack save は、基盤となる Git コミットでローカルの pre-commit フックと commit-msg フックを回避する --no-verify をサポートします。これは git commit --no-verify と同様に扱い、スキップするフックの内容を把握し、意図的に回避する場合にのみ使用してください。

並べ替えと復旧

glab stack reorder は、現在のスタック順序をエディターで開き、各ブランチを新しい親ブランチにリベースして、GitLab 上で移動したマージリクエストのターゲットを変更します。ブランチはプッシュしませんが、これはドライランではなくリモートへの書き込み操作です。実行する前に、MR のターゲット変更を承認してください。書き換えられた履歴を確認した後、glab stack sync を実行して、リベースしたブランチを強制プッシュしてください。

glab stack reorder

# After resolving a rebase conflict and running git rebase --continue
glab stack reorder --continue

# Restore the original branch order instead
glab stack reorder --abort

並べ替えのリベース処理中に、別の並べ替えを開始しないでください。再試行する前に、競合を解決して処理を続行するか、処理を中止してください。競合とリベースの出力は、自動化ログに保存してください。

ローカルのスタックメタデータを削除する

# Choose a stack interactively
glab stack delete

# Delete a named stack after confirmation
glab stack delete <stack-name>

# Approved non-interactive deletion
glab stack delete <stack-name> --yes

削除されるのは、スタックのローカルな stacked-metadata ディレクトリだけです。ブランチ、コミット、マージリクエストは削除されません。--yes を指定する前にスタック名とリポジトリを確認し、$(git rev-parse --git-common-dir)/stacked/ の下に指定したディレクトリがないことを確認してください。この読み取り専用の確認方法は、通常のチェックアウトとリンクされたワークツリーの両方で使えます。glab stack list に表示されるのは現在のスタックのレイヤーだけなので、別のスタックが削除されたことは確認できません。

サブコマンド

  • create:新しいスタックを作成してアクティブにします。
  • switch:アクティブなスタックを別のものに切り替えます。
  • infer:Git のリビジョン範囲からアクティブなスタックに差分を追加します。アクティブなスタックがない場合は、スタックを作成します。
  • save:変更を新しい差分として保存します。
  • amend:変更を既存の差分に保存します。
  • list:アクティブなスタック内のすべての差分を一覧表示します。
  • first:最初の差分に移動します。
  • last:最後の差分に移動します。
  • next:次の差分に移動します。
  • prev:前の差分に移動します。
  • move:指定した差分に移動します。
  • reorder:ブランチをプッシュせずに、並べ替えた差分をリベースし、GitLab 上で移動した MR のターゲットを変更します。
  • sync:前述のスキップフラグに従って、スタックをプッシュし、そのマージリクエストを作成または更新します。
  • delete:ブランチ、コミット、MR ではなく、ローカルのスタックメタデータを削除します。

--help の出力全体については、references/commands.md を参照してください。

コメント