miseの--affectedで未コミットの変更に応じてタスクを実行する

miseの--affectedで未コミットの変更に応じてタスクを実行する

miseの--affectedを使うと、Gitの変更に関係するプロジェクトのタスクを選んで実行できます。未コミットの編集と新規ファイルを対象にするコマンドを紹介し、2つのプロジェクトで選択結果と実行前の確認方法を試します。
2026.10.14

どうも!オペ部の西村祐二です!

1つのGitリポジトリにfrontendとbackendがあり、それぞれにテスト用のタスクを定義しているとします。frontendだけを編集したときに、変更に関係するタスクを選んで実行したい場面があります。

miseの--affectedを使うと、Gitの変更から実行対象のプロジェクトを選べます。mise 2026.10.6からは、コミット済みの差分だけでなく、手元の未コミット変更も対象になりました。experimental = trueの設定も不要です。

この記事では、未コミットの編集と新規ファイルを対象にするコマンドを紹介し、2つのプロジェクトで実行結果を確認します。

未コミットの変更があるプロジェクトを選ぶ

モノレポは、1つのリポジトリに複数のプロジェクトを置いた構成です。miseのモノレポ設定と、package.jsonのworkspacesなどのプロジェクト情報を用意している場合は、リポジトリのルートで次のコマンドを使えます。これから設定する場合は、次のサンプルで必要なファイルを用意できます。

mise run --affected --affected-uncommitted --affected-untracked test

末尾のtestはタスク名です。各プロジェクトに定義したtestのうち、Gitの変更に関係するものが実行されます。

2つのフラグは、対象にする変更の種類を指定しています。

  • --affected-uncommitted:Gitが追跡しているファイルの編集。ステージ済み・未ステージの両方を含みます。
  • --affected-untracked:まだGitに追加していない新規ファイル。Gitのignore設定で除外されたファイルは含みません。

用途に応じて、次のように選び分けられます。フラグを指定すると、指定した種類の変更だけが対象になります。

対象にしたい変更 --affectedと一緒に指定するフラグ
手元の編集と新規ファイル --affected-uncommitted --affected-untracked
追跡済みファイルの編集だけ --affected-uncommitted
新規ファイルだけ --affected-untracked
コミット済みの差分だけ --affected-committed

--affectedだけを指定した場合は、コミット済みの差分・追跡済みファイルの編集・新規ファイルをすべて含みます。手元の作業だけを確認したいときは、冒頭の2つのフラグを指定します。

2つのプロジェクトで試す

ここからは、同じ結果を再現できる小さなサンプルを用意します。タスクにはechoを使い、どちらのプロジェクトで実行されたかを表示します。実際のテストコードは用意しません。

動作確認に使った環境は、Ubuntu 24.04.5 / Linux arm64、Git 2.43.0、mise 2026.10.6です。mise 2026.10.8でも同じ選択結果を確認しました。

1. プロジェクトとタスクを定義する

miseとGitを使えるシェルで、新しいディレクトリを作成します。

mkdir mise-affected-demo
cd mise-affected-demo
git init -q
git config user.name 'Tips Demo'
git config user.email 'tips@example.invalid'
mkdir -p projects/frontend/src projects/backend/src

ルートのmise.tomlでモノレポを有効にし、タスク設定の置き場所を指定します。

mise.toml
monorepo_root = true

[monorepo]
config_roots = ["projects/frontend", "projects/backend"]

変更がどのプロジェクトに属するかをmiseが判定できるように、package.jsonのworkspacesでプロジェクトの一覧を定義します。

package.json
{"private":true,"workspaces":["projects/*"]}

各プロジェクトにも、nameを指定したpackage.jsonを作成します。

printf '{"name":"frontend","version":"1.0.0","private":true}\n' > projects/frontend/package.json
printf '{"name":"backend","version":"1.0.0","private":true}\n' > projects/backend/package.json

frontendとbackendに、それぞれtestタスクを定義します。

projects/frontend/mise.toml
[tasks.test]
run = "echo FRONTEND_TEST"
projects/backend/mise.toml
[tasks.test]
run = "echo BACKEND_TEST"

config_rootsはタスク設定を読み込む場所、workspaceの定義はプロジェクトと依存関係を把握するための情報です。このサンプルでは両方を用意しています。詳細は公式のworkspace graphドキュメントで確認できます。パッケージのインストールは不要です。

最後に、変更前のファイルをコミットし、作成したmise設定を信頼済みにします。

printf 'initial\n' > projects/frontend/src/demo.txt
printf 'initial\n' > projects/backend/src/demo.txt
git add .
git commit -qm 'Initial demo'
mise trust

2. コミット済みの変更と手元の変更を作る

まずbackendの変更をコミットします。その後、frontendを編集し、backendに新規ファイルを作成します。

printf 'committed change\n' >> projects/backend/src/demo.txt
git add projects/backend/src/demo.txt
git commit -qm 'Change backend'

printf 'local edit\n' >> projects/frontend/src/demo.txt
printf 'new local file\n' > projects/backend/src/new.txt
git status --short

現在の状態は次のとおりです。

プロジェクト 変更内容
frontend src/demo.txtに未コミットの編集
backend src/demo.txtの変更はコミット済み、src/new.txtは未追跡

git status --shortには、手元の変更が表示されます。

 M projects/frontend/src/demo.txt
?? projects/backend/src/new.txt

3. 変更の種類ごとにタスクを実行する

追跡済みファイルの編集だけを選ぶと、frontendのtestだけが実行されました。

mise run --affected --affected-uncommitted test
[//projects/frontend:test] $ echo FRONTEND_TEST
FRONTEND_TEST

未追跡ファイルだけを選ぶと、backendのtestが実行されました。

mise run --affected --affected-untracked test
[//projects/backend:test] $ echo BACKEND_TEST
BACKEND_TEST

冒頭のように2つのフラグを組み合わせた場合は、両方のtestが実行されました。frontendの編集と、backendの新規ファイルがそれぞれ対象になります。

また、git add projects/frontend/src/demo.txtで編集をステージした後も、--affected-uncommittedでfrontendのtestが実行されました。ステージ済みであっても、コミット前の編集は対象になります。

次の画像はステージ後の状態で、編集・新規ファイル・コミット差分をそれぞれ選んだ結果です。表示を短くするため--quietを追加しています。

miseの追跡済み変更・未追跡ファイル・コミット差分の選択結果

実行前に対象のプロジェクトを確認する

実際にタスクを動かす前に対象を確かめる場合は、--affected-explainと--dry-runを追加します。

mise run --affected --affected-uncommitted --affected-explain --dry-run test

今回の結果では、frontendの選択理由としてprojects/frontend/src/demo.txtが表示されました。タスクは実行せず、実行予定のecho FRONTEND_TESTが表示されます。

対象が想定と違うときに確認すること

--affectedは、ローカル実行では既定でHEAD~1とHEADを比較し、コミット済みの差分を取得します。手元の変更を除外して、この差分だけで選ぶ場合は--affected-committedを指定します。

このサンプルの2プロジェクトには依存関係がありません。公式ドキュメントでは、依存関係や共有入力によって対象が広がり、実行対象タスクの前提となるタスクも通常どおり実行されると説明されています。実際のリポジトリで対象が多くなる場合は、--affected-explain --dry-runで理由を確認できます。

まとめ

mise 2026.10.6以降では、--affectedでコミット前の変更も対象にできます。手元の編集と新規ファイルをまとめて選ぶには、--affected-uncommitted --affected-untrackedを組み合わせます。

実行対象を事前に確認したい場合は、--affected-explain --dry-runを追加できます。変更の種類と選択理由を確認しながら、既存のタスクを実行するプロジェクトを絞れます。

参考リンク:

この記事をシェアする

関連記事