45395 - シコウサクゴ -

Claude Codeのgit commitで発生するシェルエスケープ問題とHEREDOCによる解決

Claude Codeでgit commitを実行すると、コミットメッセージの -m オプションがシェルに誤解釈されてエラーになる——この問題はClaude Codeを使い始めた初期に何度もハマったトラップです。

本記事では、claudelogプロジェクト(2026年2月)での実体験をもとに、具体的なエラーパターンとHEREDOCによる解決策を記録します。


エラーパターン1: 複数行の-mオプション

発生したエラー

Claude Codeが以下のようなgit commitコマンドを生成しました。

Terminal window
1
git commit -m "feat: implement markdown append" \
2
-m "Add parsing and summarization pipeline" \
3
-m "Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>"

エラーメッセージ

1
error: pathspec ' ' did not match any file(s) known to git
2
zsh: command not found: -m

原因

バックスラッシュ \ による行継続がzsh環境で正しく処理されず、2行目以降の -m がgitのサブコマンドではなく独立したコマンドとして解釈されました。

Claude CodeのBashツールでは、コマンドの受け渡し方によってはバックスラッシュの行継続が期待通りに機能しないケースがあります。


エラーパターン2: 引用符のネスト

発生したエラー

Terminal window
1
git commit -m "feat: implement claudelog" -m "Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>"

エラーメッセージ

1
error: switch 'm' requires a value
2
zsh: command not found: Co-Authored-By

原因

引用符の解釈が崩れ、-m の値が空になり、Co-Authored-By: 以降がコマンドとして解釈されました。特にコミットメッセージに <> が含まれる場合(Co-Authored-Byのメールアドレス部分)、シェルがリダイレクトとして解釈しようとします。


解決策: HEREDOCを使ったコミットメッセージ

最終的に安定したのは、HEREDOCを使う方法です。

Terminal window
1
git commit -m "$(cat <<'EOF'
2
feat: implement claudelog markdown append
3
4
Add functionality to parse Claude Code conversation logs
5
and append summaries to markdown files using Ollama.
6
7
- Parse JSONL conversation logs
8
- Summarize with Ollama local LLM
9
- Append results to Markdown file
10
11
Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
12
EOF
13
)"

なぜHEREDOCが安定するのか

  1. <<'EOF'(シングルクォート付き) — ヒアドキュメント内の変数展開や特殊文字のエスケープが無効化される。$`\ がすべてリテラルとして扱われる
  2. $(...)でコマンド置換cat の出力をそのまま -m の値として渡す。改行もそのまま保持される
  3. < > の問題が解消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プロジェクトでは、コミット操作をユーザー(人間)が手動で実行する形に落ち着きました。


推奨パターン

安全なコミットメッセージの書き方

Terminal window
1
# パターン1: HEREDOC(推奨)
2
git commit -m "$(cat <<'EOF'
3
コミットメッセージ本文
4
5
詳細説明
6
7
Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
8
EOF
9
)"
10
11
# パターン2: シンプルな1行メッセージ(特殊文字なし)
12
git commit -m "feat: add parsing module"

避けるべきパターン

Terminal window
1
# NG: バックスラッシュによる行継続
2
git commit -m "line1" \
3
-m "line2" \
4
-m "line3"
5
6
# NG: 山括弧を含むメッセージを引用符のみで囲む
7
git commit -m "Co-Authored-By: Name <email>"

CLAUDE.mdへの記載例

プロジェクトの CLAUDE.md に以下を記載しておくと、Claude Codeが最初からHEREDOCパターンでコミットを生成するようになります。

1
## Gitコミットルール
2
3
コミットメッセージは必ずHEREDOCを使用すること:
4
5
git commit -m "$(cat <<'EOF'
6
メッセージ本文
7
8
Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
9
EOF
10
)"

まとめ

問題原因解決策
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に記載してしまえば、以降のプロジェクトでも同じ問題に悩まされることはなくなります。

Article title:Claude Codeのgit commitで発生するシェルエスケープ問題とHEREDOCによる解決
Article author:45395
Release time:2026-04-08

記事へのご質問・ご感想をお聞かせください

フィードバックを送る