Skip to content

Gitのsafe.directoryエラーとその解決方法

問題の概要

Gitバージョン2.35.2以降で、「unsafe repository」エラーが発生するようになりました:

fatal: unsafe repository ('F:/GitHub/my-project' is owned by someone else)
To add an exception for this directory, call:

git config --global --add safe.directory F:/GitHub/my-project

このエラーは、Gitのセキュリティ脆弱性(CVE-2022-24765)に対処するために導入された安全対策です。

エラーの原因

Gitはリポジトリの上位ディレクトリを探索する際、現在のユーザーが所有していないディレクトリに遭遇すると、セキュリティリスクとして判断しエラーを発生させます。

セキュリティ背景

この対策は、他のユーザーが所有するディレクトリ内でGitを実行した場合に発生する可能性のある権限昇格攻撃を防ぐために導入されました。

解決方法

方法1: 安全なディレクトリとして登録(推奨)

特定のディレクトリを安全として明示的に登録します:

bash
git config --global --add safe.directory F:/GitHub/my-project

複数のプロジェクトがある場合は、各プロジェクトごとに登録が必要でしたが、最新バージョンでは改善されています。

方法2: ワイルドカードを使用した一括登録(Git 2.35.3以降)

すべてのディレクトリを安全として登録(セキュリティリスクに注意):

bash
git config --global --add safe.directory "*"

注意

この方法は共有環境やマルチユーザーシステムでは推奨されません。ローカル環境で単独使用する場合のみご利用ください。

方法3: 親ディレクトリの一括登録(Git 2.46.0以降)

Git 2.46.0以降では、親ディレクトリをワイルドカードで指定可能:

bash
git config --global --add safe.directory "F:/GitHub/*"

これでF:/GitHub/以下のすべてのリポジトリが安全として認識されます。

方法4: 所有権の変更

ファイルシステムの所有権を現在のユーザーに変更します:

Windowsの場合

bash
takeown.exe /f . /r

Linux/macOSの場合

bash
sudo chown -R $USER:$USER .

方法5: システム全体の設定

システム全体で安全なディレクトリを設定(管理者権限が必要):

bash
sudo git config --system --add safe.directory "*"

プラットフォーム別の注意点

Windowsでの注意事項

  • パスの大文字小文字を正確に一致させる必要があります
  • 引用符の有無に注意(ネットワークパスの場合)
  • パスの末尾のスラッシュは省略してください

正しい例

bash
git config --global --add safe.directory F:/GitHub/my-project

誤った例

bash
git config --global --add safe.directory f:/GitHub/my-project/  # 大文字小文字、末尾スラッシュ

WSL (Windows Subsystem for Linux) 環境

WSLからWindowsのファイルシステムにアクセスする場合:

bash
git config --global --add safe.directory "%(prefix)///wsl.localhost/Ubuntu/home/user/project"

ネットワークドライブの場合

ネットワーク共有ディレクトリでは、引用符を省略する必要がある場合があります:

bash
# 単一引用符ではなく
git config --global --add safe.directory %(prefix)///server/share/project

最新の改善点(Git 2.47以降)

Git 2.47ではsafe.directoryのパス正規化が改善され、シンボリックリンクを経由したパスとの一致も適切に処理されるようになりました。

トラブルシューティング

設定の確認

現在の安全なディレクトリ設定を確認:

bash
git config --global --get-all safe.directory

重複エントリの削除

重複エントリがある場合、すべてを置き換え:

bash
git config --global --replace-all safe.directory "*"

Visual Studioユーザーへの注意

Visual Studioは独自のGitバージョンを使用している可能性があります。IDEが最新のGitを使用していることを確認してください。

まとめ

safe.directoryエラーはGitのセキュリティ強化によるもので、以下の方法で解決できます:

  1. 特定ディレクトリの登録 - 最も安全な方法
  2. ワイルドカード使用 - 便利だがセキュリティリスクを理解した上で
  3. 所有権変更 - 根本的な解決策
  4. Gitの更新 - 最新機能を利用する

環境やセキュリティ要件に応じて適切な方法を選択してください。