問題の概要git status や git pull を実行しようとした際、通常の出力ではなく、ターミナルに予期せぬエラーが表示されることがあります。Gitが突然動作を拒否し、以下のようなストレスの溜まるセキュリティ警告が表示されます。
fatal: detected dubious ownership in repository at '/Users/username/project'
これは通常、Gitのアップデート直後や、ローカル開発環境と Docker コンテナ間を行き来しているときに発生します。コミットやプッシュ、あるいは現在のブランチの確認すらできなくなるため、ワークフローを完全に停止させてしまう問題です。
根本的な原因これはランダムに発生するバグではなく、意図的なセキュリティ対策です。2022年4月、Git チームは CVE-2022-24765 として知られる脆弱性を修正するためにパッチ(v2.35.2)をリリースしました。
共有システムにおいて、悪意のあるユーザーが自身が所有する親ディレクトリに .git フォルダを作成する可能性があります。そのサブディレクトリで Git コマンドを実行すると、Git が誤ってあなたの高い権限を使用してコードを実行してしまう恐れがありました。これを防ぐため、Git は現在、コマンドを実行しているユーザーが実際にリポジトリフォルダの所有者であるかを確認するようになっています。不一致がある場合、Git はアクセスをブロックします。
macOS では、以下のような場合にこの制限に直面する可能性が高くなります。
- Docker の不一致: Docker コンテナ内でユーザーが
root(UID 0) なのに、Mac のユーザー ID が501である場合。- 移行: Time Machine や移行アシスタントを使用して古い Mac からファイルを移行した場合。- 外付けドライブ: プロジェクトが Unix 権限を適切に処理できない FAT32 や ExFAT でフォーマットされたドライブにある場合。## ステップバイステップの解決策### 解決策 1:特定のディレクトリを信頼する(推奨)リポジトリが安全であるとわかっている場合は、その特定のパスに対して Git の所有権チェックを無視するように設定します。これは、システム全体のセキュリティ設定を下げることなく修正できるため、最もクリーンな方法です。 エラーメッセージからパスをコピーして、以下のコマンドを実行してください。
git config --global --add safe.directory /Users/username/project
ヒント: /Users/work/My Project のようにフォルダ名にスペースが含まれている場合は、パス全体を引用符(" ")で囲むようにしてください。
解決策 2:「グローバルな信頼」によるショートカット何十もの異なるプロジェクトでこのエラーが発生していませんか?これは Docker Compose を多用する開発者によく見られる現象です。すべてのフォルダを手動で追加する代わりに、マシン上のすべてのディレクトリを信頼するように Git に指示することができます。
git config --global --add safe.directory '*'
この設定は慎重に行ってください。ワイルドカード '*' を使用すると、2022年に導入された Git のセキュリティ修正を事実上無効にすることになります。自分だけが使用するマシンの場合にのみ、この方法を検討してください。
解決策 3:フォルダの所有権を再取得するプロジェクトが完全にローカルなものである場合、最も長期的な解決策は、macOS のユーザーが実際にファイルの所有者であることを確認することです。これにより、ファイルシステムの権限が Git の期待する状態と一致します。
sudo chown -R $(whoami) /Users/username/project
このコマンドは、フォルダの所有者を現在ログインしているユーザーに再帰的に変更します。これは一度限りの修正であり、通常は Git の設定を変更することなく問題を解決できます。
修正の確認方法上記のいずれかの手順を適用した後、基本的なコマンドを実行してテストします。
git status
ステージングされた変更やブランチ名が表示されれば、準備完了です。現在「安全」としてマークされているすべてのディレクトリのリストを確認するには、以下を実行します。
git config --global --get-all safe.directory
まとめと重要なポイントセキュリティアップデートは煩わしく感じることもありますが、それには理由があります。macOS で所有権の問題をトラブルシューティングする際は、以下の点に注意してください。
- UID を確認する: Docker は多くの場合
root(UID 0) として動作し、Mac ユーザーは通常501であることを覚えておいてください。この 501 対 0 の競合が、このエラーの最大の原因です。- 具体的に指定する: 可能な限り「解決策 1」を使用してください。ワイルドカードですべてを許可するよりも、安全なディレクトリのリストを管理する方がセキュリティ上好ましいです。- 末尾のスラッシュ: Git は厳密です。safe.directory設定のパスが、エラーメッセージに表示されているパスと一文字ずつ正確に一致していることを確認してください。

