Claude Codeでgit commitを実行すると、コミットメッセージの -m オプションがシェルに誤解釈されてエラーになる——この問題はClaude Codeを使い始めた初期に何度もハマったトラップです。
本記事では、claudelogプロジェクト(2026年2月)での実体験をもとに、具体的なエラーパターンとHEREDOCによる解決策を記録します。
エラーパターン1: 複数行の-mオプション
発生したエラー
Claude Codeが以下のようなgit commitコマンドを生成しました。
1git commit -m "feat: implement markdown append" \2 -m "Add parsing and summarization pipeline" \3 -m "Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>"エラーメッセージ
1error: pathspec ' ' did not match any file(s) known to git2zsh: command not found: -m原因
バックスラッシュ \ による行継続がzsh環境で正しく処理されず、2行目以降の -m がgitのサブコマンドではなく独立したコマンドとして解釈されました。
Claude CodeのBashツールでは、コマンドの受け渡し方によってはバックスラッシュの行継続が期待通りに機能しないケースがあります。
エラーパターン2: 引用符のネスト
発生したエラー
1git commit -m "feat: implement claudelog" -m "Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>"エラーメッセージ
1error: switch 'm' requires a value2zsh: command not found: Co-Authored-By原因
引用符の解釈が崩れ、-m の値が空になり、Co-Authored-By: 以降がコマンドとして解釈されました。特にコミットメッセージに < や > が含まれる場合(Co-Authored-Byのメールアドレス部分)、シェルがリダイレクトとして解釈しようとします。
解決策: HEREDOCを使ったコミットメッセージ
最終的に安定したのは、HEREDOCを使う方法です。
1git commit -m "$(cat <<'EOF'2feat: implement claudelog markdown append3
4Add functionality to parse Claude Code conversation logs5and append summaries to markdown files using Ollama.6
7- Parse JSONL conversation logs8- Summarize with Ollama local LLM9- Append results to Markdown file10
11Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>12EOF13)"なぜHEREDOCが安定するのか
<<'EOF'(シングルクォート付き) — ヒアドキュメント内の変数展開や特殊文字のエスケープが無効化される。$、`、\がすべてリテラルとして扱われる$(...)でコマンド置換 —catの出力をそのまま-mの値として渡す。改行もそのまま保持される<>の問題が解消 —Co-Authored-By: Name <email>の山括弧がリダイレクトとして解釈されない
その他のgit関連トラブル
git hookの権限問題
Claude Codeがgit commitを実行しようとした際、git hookの実行権限がないためにエラーが発生するケースがありました。
解決策: .claude/settings.local.json でhookの設定を行うことで、Claude Codeがgit hookを正しく処理できるようになります。
git resetの許可問題
開発中にstaging状態をリセットしたい場面で、Claude Codeが git reset を実行しようとしてブロックされることがありました。
Claude Codeはデフォルトで git reset のような破壊的な操作に対して確認を求めます。これは安全機能として意図された動作ですが、開発のテンポが落ちる場合があります。
最終的にclaudelogプロジェクトでは、コミット操作をユーザー(人間)が手動で実行する形に落ち着きました。
推奨パターン
安全なコミットメッセージの書き方
1# パターン1: HEREDOC(推奨)2git commit -m "$(cat <<'EOF'3コミットメッセージ本文4
5詳細説明6
7Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>8EOF9)"10
11# パターン2: シンプルな1行メッセージ(特殊文字なし)12git commit -m "feat: add parsing module"避けるべきパターン
1# NG: バックスラッシュによる行継続2git commit -m "line1" \3 -m "line2" \4 -m "line3"5
6# NG: 山括弧を含むメッセージを引用符のみで囲む7git commit -m "Co-Authored-By: Name <email>"CLAUDE.mdへの記載例
プロジェクトの CLAUDE.md に以下を記載しておくと、Claude Codeが最初からHEREDOCパターンでコミットを生成するようになります。
1## Gitコミットルール2
3コミットメッセージは必ずHEREDOCを使用すること:4
5git commit -m "$(cat <<'EOF'6メッセージ本文7
8Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>9EOF10)"まとめ
| 問題 | 原因 | 解決策 |
|---|---|---|
command not found: -m | 行継続の失敗 | HEREDOCを使用 |
switch 'm' requires a value | 引用符のネスト崩壊 | HEREDOCを使用 |
command not found: Co-Authored-By | <>のリダイレクト解釈 | <<'EOF'(変数展開無効) |
| git hook権限エラー | hook実行権限の不足 | settings.local.jsonで設定 |
Claude Codeでgit操作をする際は、コミットメッセージにHEREDOCを使うことを標準パターンとして定着させるのが最も確実です。一度CLAUDE.mdに記載してしまえば、以降のプロジェクトでも同じ問題に悩まされることはなくなります。