AI活用

ComfyUI WorkflowをGitで管理する|JSON差分・モデル・Node Versionの扱い

ComfyUIのworkflowをGitで管理するなら、JSON・設定・依存の台帳だけをリポジトリに入れ、model本体と生成物は外に置きます。命名とフォルダ規約、modelのURL・hash・license台帳、custom nodeのmanifest、整形で差分を読みやすくする方法、検証条件の紐づけまで解説します。

この記事の目次
  1. 結論:小さいテキストはGit、大きいバイナリは台帳だけ
  2. Gitで管理するものは何か
  3. Workflow JSONをどう置くか
  4. Model本体はなぜ入れないのか
  5. Custom Nodeとversionをどう残すか
  6. JSON差分をどう読みやすくするか
  7. workflowを1か所変えてgit diffで変更nodeを特定する
  8. 生成物と検証条件をどう紐づけるか
  9. よくある質問
  10. Git LFSを使えばmodelも入れられますか?
  11. GUI形式とAPI形式のどちらをcommitすべきですか?
  12. workflowを共有するとき、相手に何を渡せばよいですか?
  13. まとめ

ComfyUIのworkflowをGitで管理するなら、リポジトリに入れるのはworkflow JSON・設定・依存の台帳までで、model本体と生成物は外に置きます。workflow JSONにはmodelファイルもcustom nodeも含まれないため、「何があれば再現できるか」を台帳として一緒にcommitすることが管理の中心になります。

情報確認日:2026年8月22日(日本時間)

結論:小さいテキストはGit、大きいバイナリは台帳だけ

責任範囲

  • workflow JSON・extra_model_paths.yaml・README・台帳(テキスト)をGitに入れる
  • model本体・生成画像・動画はGitに入れず、URL・hash・licenseを台帳に書く
  • custom nodeはname・version・commit・requirementsをmanifestとして残す
  • commit前にJSONを同じ規則で整形し、意味のある差分だけが残るか検証する
  • Release(tag)ごとにsample画像・seed・検証CSVの場所を紐づける
  • JSONの読み込みと依存確認はworkflow JSONを読み込む方法、環境の復元はSnapshotで戻す方法に任せる
スポンサーリンク

Gitで管理するものは何か

公式ドキュメントは、workflowをJSONとして保存・共有できる一方で、「workflowにはmodelファイル・入力素材・custom node packageは含まれない」と明記しています。つまりJSONだけをcommitしても、他のPCで同じ結果は出ません。管理対象は「JSON+再現に必要な情報」のセットです。

もの Gitに入れるか 代わりに残すもの
workflow JSON(GUI形式・API形式) 入れる
extra_model_paths.yaml・起動フラグ 入れる(パスは環境差を注記)
README・台帳・manifest 入れる
checkpoint・LoRA・VAE等のmodel本体 入れない URL・hash・license・配置先の台帳
custom node本体 入れない(別リポジトリ) name・version・commitのmanifest
生成画像・動画 入れない Releaseごとのsample数枚の保存場所とseed
入力素材(参照画像など) 小さく権利が明確なら入れる それ以外は出所と保存場所

線引きの基準は「テキストで、差分に意味があり、数MB以内」です。modelは数GBのバイナリで差分に意味がなく、生成画像は同じworkflowから再生成できます。どちらもGitの履歴を重くするだけで、管理の価値がありません。

# .gitignore
models/
output/
input/*
!input/.gitkeep
*.safetensors
*.ckpt
*.png
*.mp4

Workflow JSONをどう置くか

フォルダと命名の規約を先に決めると、後から探す時間が減ります。この記事では「用途/名前/版」の順で整理します。

comfy-workflows/
├── README.md
├── workflows/
│   ├── portrait/
│   │   ├── portrait-sdxl.json            # GUI 形式(UI で開く用)
│   │   ├── portrait-sdxl.api.json        # API 形式(スクリプト実行用)
│   │   └── README.md                     # 目的・必要 model・既知の制約
│   └── product-photo/
├── models.csv                            # model 台帳
├── custom-nodes.lock.json                # custom node manifest
├── extra_model_paths.yaml.example
└── releases/
    └── v1.2.0/
        ├── samples/                      # sample 画像の保存先(Git 管理外でもよい)
        └── benchmark.csv
  • ファイル名は小文字・ハイフン区切りにし、日本語と空白を避ける(スクリプトから扱いやすい)
  • GUI形式とAPI形式を両方置く場合は.api.jsonのように拡張子で区別する
  • 版はファイル名ではなくGitのtagで表す。portrait-v2-final.jsonのような名前を増やさない
  • workflowごとのREADMEに「何を作るworkflowか」「必要なmodel」「想定解像度」「既知の制約」を書く

ファイル名に版を入れない理由は、同じworkflowの履歴をGitが持っているからです。名前で版を表すと、どれが最新かをGitの外で管理することになります。

Model本体はなぜ入れないのか

modelをGitに入れない代わりに、「どこから・どのファイルを・どのlicenseで・どこに置いたか」を台帳にします。hashを残すのは、同名で中身の違うファイルを見分けるためです。

# models.csv
kind,filename,source_url,sha256,license,commercial_use,place_under,checked_at,note
checkpoint,example-base.safetensors,https://example.com/model-page,<sha256>,<license name>,yes/no,models/checkpoints,2026-09-20,
lora,example-style.safetensors,https://example.com/lora-page,<sha256>,<license name>,yes/no,models/loras,2026-09-20,trigger word: ...
vae,example-vae.safetensors,https://example.com/vae-page,<sha256>,<license name>,yes/no,models/vae,2026-09-20,
# hash の取り方(Linux / macOS)
shasum -a 256 models/checkpoints/example-base.safetensors

台帳があれば、別のPCで「どのファイルをどこに置けば動くか」が分かります。公式ドキュメントが案内するComfyUI/models/配下の配置(checkpointslorasvaeなど)をplace_under列に書いておくと、配置の迷いも消えます。

licenseとcommercial_useは、workflowを共有する相手のためにも必ず埋めます。workflowは自由に配れても、そこで使うmodelの利用条件は別です。

Custom Nodeとversionをどう残すか

custom nodeはそれぞれ独立したGitリポジトリで、更新で挙動が変わります。workflowが動いた時点のnode一覧とversionを、manifestとしてcommitします。

{
  "comfyui": {
    "commit": "<git rev-parse HEAD の値>",
    "python": "3.12.x",
    "torch": "X.Y.Z+cu130"
  },
  "custom_nodes": [
    {
      "name": "example-node-pack",
      "repo": "https://github.com/example/example-node-pack",
      "version": "1.4.2",
      "commit": "<commit hash>",
      "requirements": ["somelib>=2.0"]
    }
  ],
  "recorded_at": "2026-09-20"
}

versionはcustom nodeのpyproject.tomlにある値、commitはそのフォルダでgit rev-parse HEADを実行した値です。両方残すのは、Registry経由で入れた場合とgit cloneで入れた場合で、手元にある情報が違うからです。

このmanifestから環境を復元する作業そのものは、Snapshot機能を扱う別記事に任せます。この記事の役割は「復元に必要な情報を、workflowと同じcommitに残す」ことです。nodeを自分で開発している場合は、そのnodeのversionとtagの付け方をカスタムノードのCI/CDに合わせておくと、manifestのversionがそのまま使えます。

JSON差分をどう読みやすくするか

ComfyUIが保存するJSONは、UIでnodeを少し動かしただけでも座標が変わり、差分に「意味のない行」が混ざります。commit前に同じ規則で整形すると、少なくともキーの順序や空白による差分は消えます。座標の差分まで消すかどうかは、次の検証で決めます。

# commit 前に、キーをソートして 2 スペースで整形する
jq --indent 2 -S . workflows/portrait/portrait-sdxl.json > tmp.json && mv tmp.json workflows/portrait/portrait-sdxl.json

整形を自動化するなら、Gitのpre-commit hookやタスクランナーに同じコマンドを入れ、手で実行するかどうかで結果が変わらないようにします。

workflowを1か所変えてgit diffで変更nodeを特定する

整形の効果と差分の読み方は、実際に1か所だけ変えて確かめます。手順は次のとおりです。

  1. 整形済みのJSONをcommitしておく
  2. UIで開き、KSamplerのstepsなど値を1つだけ変えて上書き保存する(nodeは動かさない)
  3. 同じ整形コマンドを通し、git diffを見る
  4. 次に、nodeを少し移動しただけで保存し、同じくgit diffを見る
--- a/workflows/portrait/portrait-sdxl.json
+++ b/workflows/portrait/portrait-sdxl.json
@@
       "type": "KSampler",
       "widgets_values": [
         12345,
         "fixed",
-        25,
+        30,
         7,
         "euler",

2の差分がこのように値の行だけなら、整形は効いています。差分の中で変わった行の近くに"type"があれば、どのnodeの値かが分かります。保存したJSONを開き、nodeごとの値がどのキーに入っているかは自分の環境のファイルで確認してください(形式はComfyUIの更新で変わることがあります)。

操作 整形前の差分行数 整形後の差分行数 変更nodeを特定できたか
stepsを1つ変更
nodeを移動のみ
nodeを1つ追加

「nodeを移動のみ」で座標の差分が多く残り、それが邪魔なら、座標キーを落とした比較用コピーを別に作る方法もあります。ただし元のJSONから座標を消すとUIでの配置が失われるため、commitするファイルからは消さないでください。

生成物と検証条件をどう紐づけるか

workflowの「この版は正しく動いた」という事実は、JSONだけでは残りません。tagを打つたびに、sample画像・seed・検証CSVをその版に紐づけます。

紐づけるもの 残し方 役割
sample画像(数枚) releases/vX.Y.Z/samples/に保存。Git外ならその場所をREADMEに 出力が変わっていないかの目視基準
seedと主要設定 sampleのファイル名かCSVに記録 同じ画像を再生成する条件
benchmark CSV releases/vX.Y.Z/benchmark.csv 速度・VRAMの基準。取り方は別記事
manifest・models.csvのその時点の内容 同じtagに含まれるので自動的に紐づく 再現に必要な依存

出力PNGにはworkflowとpromptが埋め込まれる仕様なので、sample画像そのものが「その版の証跡」にもなります。ただし画像編集ソフトで開いて保存し直すとmetadataが失われることがあるため、sampleは加工せずに保存します。

git add workflows models.csv custom-nodes.lock.json
git commit -m "portrait-sdxl: steps 25→30、sample と benchmark を更新"
git tag v1.2.0
git push origin main --tags

API形式のJSONをcommitしておけば、comfy run --workflowのようにCLIから同じworkflowを実行でき、検証の自動化にもつながります。CLIの使い方はComfy CLIの使い方を参照してください。

よくある質問

Git LFSを使えばmodelも入れられますか?

技術的には入れられますが、この記事では勧めません。数GBのファイルをLFSに入れても、配布元のlicenseと更新の問題は残り、リポジトリの持ち運びは重くなります。台帳とhashで足ります。

GUI形式とAPI形式のどちらをcommitすべきですか?

両方です。GUI形式はUIで開いて編集するため、API形式はスクリプトやCLIから実行するために使います。片方から他方を再生成できますが、手順が必要なので、同じcommitに両方入れておく方が扱いやすくなります。

workflowを共有するとき、相手に何を渡せばよいですか?

このリポジトリ(JSON・README・models.csv・manifest)を渡し、modelは台帳のURLから相手が取得する形にします。licenseの確認も相手側で行えるよう、台帳のlicense列を空欄にしないでください。

まとめ

ComfyUI workflowのGit管理は、JSON・設定・台帳というテキストだけをリポジトリに入れ、model本体と生成物は外に置く線引きから始まります。modelはURL・hash・licenseの台帳に、custom nodeはname・version・commitのmanifestに置き換えます。

commit前の整形で差分を意味のある行に絞り、1か所変えてgit diffで変更nodeを特定できるかを確かめてください。tagごとにsample・seed・検証CSVを紐づければ、「この版は動いた」という事実まで含めて履歴になります。

スポンサーリンク